浅谈基于插件的软件框架(1)

     近段时间,由于项目需求,本人正在设计一个基于插件的软件框架,同时定义了一套插件规范,但是越到后面,越发现很多问题找不到很好的解决方法。这里本人将近段时间的一些心得体会与大家分享,同时将最近设计的一个插件框架进行简单的描述,望大家能多提意见,谢谢。

     什么是插件?

     插件是一种遵循一定规范的应用程序接口编写出来的程序。这些程序有一些统一的标准接口(当然每种规范定义的接口可能都不一样),所有插件功能的执行均通过这些接口实现。若将接口规范暴露给插件的制作者,那么任何一个人都能按照这一接口规范制作出与相关软件兼容的功能模块(插件)。比如我们常用的Winamp音频播放器,它是一个支持插件的软件,最初的Winamp音频播放器可能并不能支持所有格式的音频文件,但是它提供了一套标准接口来扩展它的功能,有了这些接口信息,我们可以将Winamp音频播放器的原始程序作为宿主程序,制作出支持任意格式的音频文件播放的插件集。

     插件有什么好处呢?可以概括为以下几点(可能概括的不全):

     1.结构清晰,且容易调整。对一个庞大的软件而言,由于很多功能模块都以插件的形式单独存在,使得系统的复杂度明显减低。

     2.易修改、可维护性强。由于插件与宿主程序之间通过接口联系,就像硬件插卡一样,可以被随时删除,插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护。

     3.模块(插件)间的独立性强,且开发效率高。由于插件与宿主程序、插件与插件之间的通信都由宿主程序来提供支持,所以各个插件可以单独的编译,提高开发效率。

     4.开发灵活度高。可以根据资源的实际情况来调整开发的方式,资源充足可以开发所有的插件,资源不充足可以选择开发部分插件,也可以请第三方的厂商开发,用户也可以根据自己的需要进行开发。

     还有一点需要明白,如上面所说的普通的插件是一种依赖于宿主程序但又可以完全独立于宿主程序的代码(物理上),但其实并不是所有的插件都是这样,很多时候我们也可以将主程序中的某个模块叫做插件。这个将在后面说明。

     C++如何开发插件(windows平台)?

     具本人所知道的在windows平台中用C++开发插件的方法有三种:

     1.基于C++的虚机制

     这种方式是基于纯粹的C++语言,我们知道C++的核心是多态,即在运行期决定应该调用哪中类型对象的函数的行为。在一个稍具规模的软件中,我们会将功能模块进行清晰的划分。于是可以有这样一种想法,我们可以定义一个接口类,该接口类由每个功能模块共用,该类没有任何的数据成员,只有一些抽象接口(纯虚函数),该类也可以称作模块的“界面”。所有的功能模块均由一个入口类对该抽象类进行继承,同时实现接口部分。所有对模块功能的调用均通过该接口类来完成(通过虚机制)。当然,由于模块的功能千变万化,提供的接口也千奇百怪,因此,为所有功能模块设计一个通用的“界面”类很困难也不合理。我们可以针对各个功能模块的特点,对模块进行分类,并设计不同的“界面”类。

     2.基于动态链接库

     动态链接库(Dynamic Link Library )是一种很好的东东,它不是可执行文件,不可单独运行,需要依附于宿主程序(exe),但是它提供了一种方法,使进程可以调用不属于其可执行代码的函数。在windows平台中,我们可以用windows自身提供的API函数(LoadLibrary)进行加载,加载完成后,dll即可以与你的宿主程序实现内存共享。于是,宿主程序就可以通过动态链接库中的导出函数来调用它所提供的功能。

     3.COM组件的方式

     COM组件想必大家用的都比较多,这里就不做说明了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值