最近关注架构问题,从很多方面了解到基于插件开发的优点和方便性。其中一个典型的例子就是Eclipse,允许广大程序员在Eclipse的核心框架基础上进行无限扩展。
那么基于插件开发具有哪些好处呢?
1)可以将各个功能交给插件完成,那么对于核心框架来说,其实只需要实现基本事件调度,数据缓存,插件管理等即可,而相应的业务逻辑可以交给插件完成.如此一来,可以非常方便的对业务逻辑进行更新,而不会影响到主框架的内容。
2)非常灵活,添加,删除功能都是非常方便和简洁,仅仅只需对插件进行控制即可实现各个功能模块的控制。
这里本人才智有限,仅通过C++ dll的方式来实现基于插件开发的简单Demo,请各位看客多多指点…
首先该框架的包括如下几块内容
架构图如下:
Demo中未实现通过ConfigManager进行插件的动态加载,而是直接调用某个dll进行加载.实际情况中可以将插件的注册通过配置文件(.ini/.xml)的方式进行注册,这里不做缀述.
从上面的类图我们可以看出该框架中主要使用的就是两个接口:
如此该架构的实现过程基本如下:
在demo中因为采用的是使用dll动态加载方式,所以需要在dll中暴露相应的注册函数
EXTERN_C CORE_API IPlugin* RegisterPlugin(IApplication*);
IApplication接口
class IApplication{public: virtual void Initlize()=0; virtual void Destory()=0; virtual void DisplayData(LPCTSTR pstrData)=0;};
IPlugin接口
class IPlugin{public: virtual LPCTSTR GetPluginName()=0; virtual void UpdateData()=0; virtual void OnStartUp(IApplication* pApp)=0; virtual void Erase() { delete this; }};
如此在application初始化是可以通过动态加载的方式注册该插件
void CApplication::Initlize(){//register plugin'sHMODULE hModule = LoadLibrary(_T("Plugin.dll"));if(hModule == INVALID_HANDLE_VALUE){::MessageBox(NULL,_T("Plugin.dll is not existed"),NULL,MB_OK);return;}PRgisterFuc regFuc = (PRgisterFuc)GetProcAddress(hModule,"RegisterPlugin");if(regFuc != NULL){IPlugin* pPlugin = regFuc(this);if(pPlugin != NULL){CPluginManager::GetInstance()->AddPlugin(pPlugin);}else{::MessageBoxW(NULL,_T("Add plugin failed"),NULL,MB_OK);}}}
在application接收到事件是需要进行相应的响应
void CApplication::UpdateData(){CPluginManager::GetInstance()->UpdateData();}
此处的由CPluginManager单件来管理插件的注册和反注册
void CPluginManager::UpdateData(){PLUGINITER iterBegin = m_plugins.begin();for(;iterBegin != m_plugins.end();++iterBegin){IPlugin* pPlugin = *iterBegin;pPlugin->UpdateData();}}
如此基本上已经完成了一个简单的基于插件的开发框架,当然本人才疏学浅,还有很多没有理解透的地方,请各位看客指点迷津,大家携手共同进步.
原文链接: https://www.cnblogs.com/SkyMouse/archive/2011/09/06/2168318.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/31840
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!