插件式设计的架构模型与实例插件式设计的架构模型与实例
----Do not call us, we will call you
插件式设计近年来非常流行,其中eclipse起了推波助澜的作用,提到插件式就会不由自主的想到
eclipse。其实插件式设计并不是什么新事物,早在几十年前就有了。像X Server就是基于插件式设计的,
除了核心功能外,它所有的扩展功能和设备驱动都是以插件方式加入进来的。
基于插件的设计好处很多:把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现。
扩展功能与框架以一种很松的方式耦合。
基于插件设计并不神秘,相反它比起一团泥的设计更简单,更容易理解。各种基于插件设计的架构都有
自己的特色,但从总体架构上看,其模型都大同小异。这里我们介绍一个简单的模型,并给出几个实例,
希望对新手有所启发。
1. 基本架构基本架构
插件式设计的应用程序,基本上可以用上图来表示。当然,此图是一种较高层次的表示,实际的设计会
更复杂一些。我们在这里为了阐述方便,不用故意搞得那么复杂。
应用程序由应用程序框架、插件接口、插件和公共函数库四部分组成。
应用程序框架负责应用程序的整体运作,它清楚程序整个流程,但并不知道每个过程具体要做什么。它
在适当的时候调用一些插件,来完成真正的功能。
插件接口是一个协议,可能用IDL描述,可能是头文件,也可能一段文字说明。插件按照这个协议实现出
来,就可以加入到应用程序中来。当然,对于复杂的系统,插件接口可能有多个,各自具有独立的功能。
插件是完成实际功能的实体,实现了要求的插件接口。尽管实现什么以及怎么实现,完全是插件自己的
自由。在实际情况来,一般还是有些限制,因为插件接口本身可能就是一个限制。如,实现编译功能的插
件,自然不能实现成一个聊天功能的插件。
公共函数库是一组函数或者类,应用程序框架和插件都可以调用。它通常是一个独立的动态库(DLL)。
应用程序框架本身是公用的,是代码复用的一种方式。但并不是所有可复用代码都可以放在框架中,特别
是插件会用到的公共代码,那会造成插件对框架的依赖。把这些公共代码提取到一个独立的库中,是一种
好的方法。
另外,值得补充说明一下的是插件接口。插件接口通常有两种:
通用插件接口:这一类插件接口是通用的,你无法从接口函数看出这个插件的功能。它的接口函数通常
有这些函数:
init : 用于初始化插件,通常在插件被加载时调用。
deinit:用于反初始化插件,通常在插件被卸载时调用。
run:让插件起动。
stop:让插件停止。
至于插件要完成什么功能,要插到哪里,在init函数里决定,它调用公共函数库里的函数把自己注册到框
架中某个位置。