插件式设计的架构模型与实例
基于插件的设计好处很多:把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现。扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布。公开插件接口,让第三方有机会扩展应用程序的功能,有财大家一起发。另外,还可以让开源与闭源共存于一套软件,你的插件是开源还是闭源,完全由你自己决定。
基于插件设计并不神秘,相反它比起一团泥的设计更简单,更容易理解。各种基于插件设计的架构都有自己的特色,但从总体架构上看,其模型都大同小异。这里我们介绍一个简单的模型,并给出几个实例,希望对新手有所启发。
1. 基本架构
|
插件式设计的应用程序,基本上可以用上图来表示。当然,此图是一种较高层次的表示,实际的设计会更复杂一些。我们在这里为了阐述方便,不用故意搞得那么复杂。
应用程序由应用程序框架、插件接口、插件和公共函数库四部分组成。
应用程序框架负责应用程序的整体运作,它清楚程序整个流程,但并不知道每个过程具体要做什么。它在适当的时候调用一些插件,来完成真正的功能。
插件接口是一个协议,可能用IDL描述,可能是头文件,也可能一段文字说明。插件按照这个协议实现出来,就可以加入到应用程序中来。当然,对于复杂的系统,插件接口可能有多个,各自具有独立的功能。
插件是完成实际功能的实体,实现了要求的插件接口。尽管实现什么以及怎么实现,完全是插件自己的自由。在实际情况来,一般还是有些限制,因为插件接口本身可能就是一个限制。如,实现编译功能的插件,自然不能实现成一个聊天功能的插件。
公共函数库是一组函数或者类,应用程序框架和插件都可以调用。它通常是一个独立的动态库(DLL)。应用程序框架本身是公用的,是代码复用的一种方式。但并不是所有可复用代码都可以放在框架中,特别是插件会用到的公共代码,那会造成插件对框架的依赖。把这些公共代码提取到一个独立的库中,是一种好的方法。
另外,值得补充说明一下的是插件接口。插件接口通常有两种:
通用插件接口:这一类插件接口是通用的,你无法从接口函数看出这个插件的功能。它的接口函数通常有这些函数:
init : 用于初始化插件,通常在插件被加载时调用。
deinit:用于反初始化插件,通常在插件被卸载时调用。
run:让插件起动。
stop:让插件停止。
至于插件要完成什么功能,要插到哪里,在init函数里决定,它调用公共函数库里的函数把自己注册到框架中某个位置。
专用插件接口:这一类插件接口是专用的,看到它的接口函数说明,你就可以大致了解它的功能了。
加入插件的方式通常采用配置信息来实现,配置信息可以是注册表,也可以配置文件。也可以动态注册进来,或者把插件放到指定的位置。
下面我们来看几个实例:
2. 桌面设计
最近一段时间完成了桌面模块的设计和实现。按照以往的经验,桌面模块通常是变化最多的一个模块,SPEC总是在不断的调整的效果,不同客户要求实现具有个性化的桌面,直到产品快发布了,桌面的SPEC还在不停的修改。另外,在智能手机中,桌面占有特殊的地位,很多东西都可能往桌面里塞,桌面不但是各种功能的大杂烩,还是一些系统消息的中转站。
这个任务比较棘手,所以在设计时就分外小心。首先想到的就是采用插件式设计,把外围功能独立出来,尽量简化框架的实现。
插件:每一个最小功能单元都是一个插件,它可以是可见的,也可以是不可的,也可以是动态变化的。比如时间、电池电量、网络连接、信号强弱、新事件(如SMS、MMS、EMAL、ALARM和未接电话等)、应用程序快捷方式、左右操作按钮和其它处理系统事件的功能单元。每个插件都用一个.desktop来描述,这是遵循freedesktop.org的标准的。
桌面框架包括:状态栏、开始菜单、操作栏、桌面区、事件管理器和主题管理器。而状态栏、开始菜单、操作栏、桌面区和事件管理器都是容器,容纳各种插件。对于可见的插件,可以有自己的表现方式,也可以采用通用的表现方式。
公共函数库:一些抽象的类、实现插件的辅助类以及其它一些可能被公用的类。
插件接口:对于不可见的插件要求实现事件处理功能,可见的插件还要求实现绘制功能。
3. 模拟器设计
一个同事负责设计另外一个平台的PC模拟环境设计。在我的建议下,他对架构作了调整。调整后的架构非常简单,也可以认为是插件式的设计,它由下面几部分组成:
应用程序框架:负责模拟器基本功能,如模拟键盘和显示设备、换肤功能等。
插件:就是被模拟的平台,如microwindow及相应的手机应用程序。尽管运行时通常只有一个插件运行,这样做仍然有意义,如果要换成minigui或者其它平台时,模拟器不需要作任何修改。
公共函数库:它由应用程序框架初始化一些信息和回调函数,然后供插件(即microwindow)调用,插件利用它来实现显示和输入等驱动程序。
插件接口:如起动和停止模拟平台等。
4. GIMP
GIMP是一个功能强大的图形图像编辑器,典型的基于插件式的设计,在《unix编程艺术》中,作为插件式设计示例介绍过。
应用程序框架:GUI
插件:完成图像的各种转换和处理功能,如模糊、去斑和色彩调整等。
公共函数库:放在libgimp.so里。
插件接口:对GIMP感兴趣的朋友,可以到官方网站上去的文档。
插件式设计的架构模型与实例相关推荐
- 插件式可扩展架构设计心得(干货)
点击上方 程序员成长指北,关注公众号 回复1,加入高级 Node 进阶交流群 引子 大家可能不知道,鄙人之前人送外号"过度设计".作为一个自信的研发人员,我总是希望我开发的系统可以 ...
- Docker 的插件式设计
http://www.tuicool.com/articles/MnIRZvJ http://uzhima.com/2016/08/02/what-is-docker-volume-plugin/ 在 ...
- 大神手把手教你设计秒杀架构模型
中生代技术 链接技术大咖,分享技术干货 全文:4000字 作者:Yrion 原文首发:https://www.cnblogs.com/wyq178/p/11261711.html 前言:秒杀系统相信很 ...
- 通过自定义配置实现插件式设计
软件设计有一句话叫做"约定优于配置",很多人将其作为拒绝配置的理由.但是,"约定"和"配置"的使用,都有个度的问题.我不赞为了所谓的扩展性, ...
- 插件式架构设计实践:插件式系统架构设计简介
本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...
- 插件式架构设计实践一:插件式系统架构设计简介
本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...
- Thinkphp多用户B2B2C商城源码带安装视频 系统主要功能采用高内聚,辅助功能插件式实现
Thinkphp5多用户B2B2C商城源码+安装视频 源码分享,需要源码学习可私信我. 系统概述:本系统是基于ThinkPHP 5.1.34搭建的多商户电商平台,是目前完善度领先的电商管理平台.系统主 ...
- 「业务架构」通过设计实现业务模型架构
过去的架构师往往把他们的注意力集中在一个静态的物体上.我认为动态变化更重要:人的动态变化,他们与空间和环境条件的互动. ---------------------------------------- ...
- 软件设计的不同模型:瀑布式、快速原型法、迭代式(敏捷)
自从1968年提出"软件工程"概念以来,软件开发领域对于借鉴传统工程的原则.方法,以提高质量.降低成本的探索就从未停止过.而在这个过程中,提出了许多不同的软件开发模型,典型的有:瀑 ...
最新文章
- Huggingface及BERT代码介绍
- adodb.RecordSet的属性和方法
- html语言div什么意思,css中div是什么意思?
- 前端开发工程师 - 04.页面架构 - CSS Reset 布局解决方案 响应式 页面优化 规范与模块化...
- 【mongoDB实战】mongo对某个键添加索引
- 图解Win7下set命令使用
- 浅谈JS的数组遍历方法
- eclipse rcp应用程序重启
- 什么计算机保护,什么是分级保护!!
- GitHub 发布 Octoverse 开源软件安全趋势报告(超详)
- C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档
- .NetCore源码阅读笔记系列之Security (四) Authentication AddJwtBearer
- 员工提出离职时,再挽留已经迟了
- CDN技术详解之引言
- 泰坦尼克号数据下载链接
- linux下为php添加GD库(重新编译php)
- 关于ckeditor富文本编辑器上传图片返回“不正确的服务器响应”的解决方案
- RS232实现串口双向通讯
- 基于java(springboot)篮球竞赛预约管理系统(java毕业设计)
- TestBird《2021中国证券测试白皮书》