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、核心設計
一、 數據流程圖
二、 類圖
三、 時序圖