基于插件化的客户端框架结构介绍
前言
最近在研究桌面客户端程序框架,自己也写了一个客户端框架,所以在博客中记录开发的一些想法,与博友一起学习探讨。
1、框架定义
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。
2、框架结构
上图是框架的一个简单结构体,其中Frame为框架组件,Hplug为插件管理集,管理所有的UI插件与Logic插件(将UI显示与后台逻辑分离),公共模块包括内存池与线程池等模块。
3、框架接口
框架中完成所有的组件的加载,并对外提供框架服务接口,通过该接口可以获取到所有的插件接口。
(1)框架接口
在框架程序中调用,并初始化需要的组件。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
typedef int (__stdcall *pFrameMsgCB)(int nMsg, LPARAM lParam, const char* szInfo, long lData); BOOL FRAME_API Frame_Init(const char* szXmlFile, pFrameMsgCB pfn = NULL, long lData = 0); BOOL FRAME_API Frame_Unit(); long FRAME_API Frame_GetModule(const char* szKey, const char* szDesc, const char* szVersion);
(2)框架服务接口
在框架中将框架服务接口注册到插件中,插件在需要时通过该接口与其他插件交互。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
typedef struct tag_IFrameService { long (__stdcall *pGetModule)(const char* szKey, const char* szDesc, const char* szVersion); }IFrameService, *pIFrameService;
4、插件接口
插件开发按照HPlugin定义规定,UI插件与Logic插件需要实现以下接口:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
typedef int (HPLUGIN_API *pHplugin_Init)(); typedef int (HPLUGIN_API *pHplugin_Unit)(); typedef void (HPLUGIN_API *pHplugin_RegSvr)(long lSvr); //该接口根据具体的插件情况而定,可不实现 typedef char* (HPLUGIN_API *pHplugin_GetInterfaceKey)(); typedef char* (HPLUGIN_API *pHplugin_GetInterfaceDesc)(); typedef char* (HPLUGIN_API *pHplugin_GetInterfaceVersion)(); typedef int (HPLUGIN_API *pHplugin_QueryInterface)(const char* szKey, const char* szDesc, const char* szVersion, HpluginInstance* pInterface);
UI插件必须返回以下实例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
typedef struct tagPluginUI { HWND (__stdcall* pCreatePlugin)(HWND hParent, RECT rc); void (__stdcall* pDestroyPlugin)(); }PluginUI;
Logic插件返回的实例根据需要而定,如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
typedef struct tag_IAdd { int (__stdcall * pAdd2)(int a, int b); }IAdd, *pIAdd;
插件配置文件说明:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8" ?> <hplug> <!-- file:插件相对路径 fkey:插件关键字 name:插件名 desc:插件说明(Logic为逻辑处理插件,UI为UI插件)version:插件版本 --> <plugin fkey="Add" name="Add" desc="Logic" version="V1.1" file="Hplugin\Logic\Add\IAdd.dll" /> </hplug>
5、框架程序
框架程序为一个win32桌面程序,根据框架对应的配置文件加载框架并启动框架程序。
框架程序配置文件说明:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8" ?> <FrameClient> <!-- 启动默认UI --> <default_ui version = ""></default_ui> <!-- 插件配置文件(包括UI插件和Logic插件) --> <hplugin>Hplugin.xml</hplugin> </FrameClient>
总结
开发者只需要关心自己的程序UI界面与后台逻辑,所有的业务逻辑都插件化,按照插件规范开发插件即可。
转载请注明来源,支持正版原创,文明博客使用风气。
--来自taukeWang0311@163.com
posted on 2016-12-27 16:12 跑的比兔子还快的乌龟 阅读(457) 评论(0) 编辑 收藏 举报