組件:提供特定功能的軟件實體,可以獨立編譯,經過不一樣的接口表現不一樣的行爲。目標是實現組件開發和產品開發分離,接口和實現分離。經過註冊組件能夠在產品中快速的定製組件相關的功能。html
1:組件定義:框架
明確組件的性質、用途、包含的接口spa
實現接口中的方法指針
一個組件一般由一個外部頭文件和若干個實現文件組成,經過庫和頭文件形式發佈日誌
//組件ID,組件管理機構統一分配
#define CID_TRACE 0x00000001
//組件實例化接口,由組件提供者實現 ICOMP* insTraceComp();
2:接口定義:code
明確接口的用途、範圍htm
肯定接口中的方法blog
接口由頭文件組成,包括接口ID定義和接口定義接口
//接口ID,組件管理機構統一分配 #define IID_IPRINT 0x00000001 #define THIS IPRINT* //接口方法 DECLARE_INTERFACE(IPRINT) { METHOD(void,init)(THIS); METHOD(void,print)(THIS); };
3:組件管理:ci
分配接口ID
分配組件ID
包含註冊組件的信息,根據用戶申請分配組件、管理組件
4:典型流程:
系統初始化階段:組件使用者實例化組件,將其註冊到組件管理器中。
運行期間:經過組件ID查找組件獲取對應的工廠指針,經過工廠建立接口實例,使用接口實例方法。
5:一個日誌組件定義
DECLARE_IMPLEMENT(PRINT) { METHOD(void,init)(THIS); METHOD(void,print)(THIS); }; void init(THIS pThis); void print(THIS pThis); THIS insPrint() { PRINT *pPrint = NULL; pPrint = (PRINT*)malloc(sizeof(PRINT)); pPrint->init = init; pPrint->print = print; return (THIS)pPrint; }
BOOL insInterface(ID iid,void** ppObj); ICOMPFACTORY* insTraceCompFactory() { ICOMPFACTORY* pFactory = NULL; pFactory = (ICOMPFACTORY*)malloc(sizeof(ICOMPFACTORY)); pFactory->instance = insInterface; return pFactory; } BOOL insInterface(ID iid,void** ppObj) { switch(iid) { case IID_IPRINT: *ppObj = insPrint(); break; default: break; } return TRUE; }
ICOMP* insTraceComp() { ICOMP* pComp = NULL; pComp = (ICOMP*)malloc(sizeof(ICOMP)); pComp->cid = CID_TRACE; pComp->pFactory = insTraceCompFactory(); return pComp; }
6:組件的使用:包括選擇、實例化、使用組件
ICOMP* pComp = NULL; //實例化組件 pComp = insTraceComp(); //註冊組件 COMP_RegistComponent(pComp);
ICOMP* pComp = NULL; IPRINT* pPrint = NULL; //根據組件ID獲取組件 COMP_GetComponent(CID_TRACE, (void**)&pComp); //根據組件工廠獲取接口實例 if(NULL != pComp) { pComp->pFactory->instance(IID_IPRINT,(void**)&pPrint); } //使用接口 if(NULL != pPrint) { pPrint->init(pPrint); pPrint->print(pPrint); }
7:總結
不一樣的組件開發者根據接口規範能夠提供不一樣的實現,經過組件管理機構分配惟一的組件ID,組件使用者只須要從組件管理模塊獲取對應組件,就能夠經過組件提供的工廠方法實例化接口並使用,這裏組件提供者和使用者徹底分離,能夠獨立開發,也能夠在不須要的時候快速裁剪。