1、功能概述linux
1、概述函数
插件是遵循必定规范的应用程序接口编写出来的程序,独立于主程序并对主程序起辅助性质做用。使用插件的做用以下:spa
(1)将功能独立于主程序,保证主程序稳定的同时,方便功能的扩展。 插件
(2)下降模块之间的依赖,便于并行开发。 设计
(3)更新量小,当底层接口不变时,只须要更新以服务、插件形式存在的功能。xml
插件服务实现加载动态连接库的功能,并提供有动态增长、调用和删除服务或插件的方法。经过调用动态连接库中导出函数,获取插件和服务实例,并在多个服务或插件之间进行中介联系,可以相互访问而不直接发生联系,统一管理全部服务或插件的整个生命周期。对象
二、 总体设计思路接口
(1)单例模式生命周期
插件服务使用单例模式,在全部地方都共用一个插件服务实例。进程
(2)调用动态连接库
经过配置文件读取,得到全部要加载的动态连接库路径和服务或插件名。将动态连接库路径做为参数传递给LoadLib()函数进行动态连接库的加载。
(a)在window平台中,三个加载动态连接库的重要函数以下:
LoadLibrary():动态加载指定的动态连接库,将其映射到当前进程使用的地址空间。
GetProcAddress():检索指定的动态连接库中的输出库函数地址。
FreeLibrary():释放指定的动态连接库。对LoadLibrary的每一次调用都应该有一个对应的FreeLibrary调用。
(b)在linux平台下,相应的三个函数分别是:
dlopen():以指定模式加载指定的动态连接库。
dlsym():根据动态连接库操做句柄与符号,返回符号对应的地址。使用这个函数不但能够获取函数地址,也能够获取变量地址。
dlclose():关闭指定句柄的动态连接库,只有当此动态连接库的使用计数为0时,才会真正被系统卸载。
(3)调用服务或插件
在插件服务中提供GetService()和GetPlugin()进行服务和插件的调用,并使用m_servItems和m_pluginItems两个map型集合进行服务和插件的存储管理。当服务或插件已经存在时直接从这两个集合中获取服务或插件,当不存在时则调用服务或插件的动态连接库,使用动态连接库中CreateObject导出函数来建立对象,并进行服务或插件的存储。
2、功能设计
一、 设计原则
(1) 实现配置文件的读取。
借助tinyxml辅助类进行xml文件的读取,得到配置文件中须要加载的服务或插件名和相应动态连接库的路径。
(2) 实现动态连接库的加载
在linux环境中使用dlopen()、dlsym()和dlclose()函数进行动态连接库的加载、函数地址获取和动态连接库关闭的操做。
(3)实现服务和插件的管理
在插件服务中使用m_servItems和m_pluginItems两个map型集合进行服务和插件的存储管理。经过GetService()和GetPlugin()函数进行服务和插件的调用,使用Add()和Delete()函数增长和删除服务或插件。
二、 数据模型列表
序号 |
数据名称 |
类型 |
含义 |
1 |
m_libHandle |
void* |
动态连接库句柄 |
2 |
m_libName |
const char* |
动态连接库名称 |
3 |
m_libItems |
map |
服务或插件名和动态连接库实例 |
4 |
m_serviceItems |
map |
服务名和服务实例 |
5 |
m_pluginItems |
map |
插件名和插件实例 |
三、 功能列表以下:
序号 |
功能名称 |
相关函数 |
处理方式 |
1 |
调用动态连接库 |
LoadLib() |
调用dlopen()函数加载动态连接库 |
2 |
获取服务或插件实例 |
GetService() GetPlugin() |
调用dlsym()函数获取CreateObject导出函数地址,获取服务或插件实例 |
3 |
管理服务或插件实例 |
AddService() DeleteService() AddPlugin() DeletePlugin() |
使用两个map类型的集合对服务、插件集合进行管理。根据服务名或插件名在集合中查找实例,当不存在时则加入到集合中,当存在时则在GetService()和GetPlugin()中返回该实例。 |
4 |
释放动态连接库 |
FreeLib() |
调用dlclose()函数释放动态连接库 |
3、核心设计
一、 数据流程图
二、 类图
三、 时序图