• 基于插件开发的架构研究


    最近关注架构问题,从很多方面了解到基于插件开发的优点和方便性。其中一个典型的例子就是Eclipse,允许广大程序员在Eclipse的核心框架基础上进行无限扩展。

    那么基于插件开发具有哪些好处呢?

    1)可以将各个功能交给插件完成,那么对于核心框架来说,其实只需要实现基本事件调度,数据缓存,插件管理等即可,而相应的业务逻辑可以交给插件完成.如此一来,可以非常方便的对业务逻辑进行更新,而不会影响到主框架的内容。

    2)非常灵活,添加,删除功能都是非常方便和简洁,仅仅只需对插件进行控制即可实现各个功能模块的控制。

    这里本人才智有限,仅通过C++ dll的方式来实现基于插件开发的简单Demo,请各位看客多多指点…

    首先该框架的包括如下几块内容

      • 主程序app:用于加载插件,响应用户输入,显示信息,数据缓存等
      • 插件:开放接口,完成自定义功能
      • sdk:为插件提供api支持,这里只是简单的几个类的声明和注册dll函数原型

    架构图如下:

    Demo中未实现通过ConfigManager进行插件的动态加载,而是直接调用某个dll进行加载.实际情况中可以将插件的注册通过配置文件(.ini/.xml)的方式进行注册,这里不做缀述.

    从上面的类图我们可以看出该框架中主要使用的就是两个接口:

      • IApplication:各个插件可以通过该接口获取应用内部的相应数据信息…例如可以在application中封装对IView(视图基类),IDocument(文档基类)等等数据,视图,或者应用本身进行操作
      • IPlugin:作为插件接口,在IPluginManager中注册,方便application的调度

    如此该架构的实现过程基本如下:

    在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's
    HMODULE 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();
    }
    }

      

    如此基本上已经完成了一个简单的基于插件的开发框架,当然本人才疏学浅,还有很多没有理解透的地方,请各位看客指点迷津,大家携手共同进步.

  • 相关阅读:
    今天再次认真整理了浏览器收藏夹
    今天再次认真整理了浏览器收藏夹
    【博客之星】CSDN2013博客之星--分析和预测
    【博客之星】CSDN2013博客之星--分析和预测
    CSDN博客的文章分类和战略规划
    CSDN博客的文章分类和战略规划
    《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入
    《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入
    个人名片与诚信
    个人名片与诚信
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2168318.html
Copyright © 2020-2023  润新知