`

插件式设计的架构模型与实例

    博客分类:
  • C#
 
阅读更多

插件式设计近年来非常流行,其中eclipse起了推波助澜的作用,提到插件式就会不由自主的想到eclipse。其实插件式设计并不是什么新事物,早在几十年前就有了。像X Server就是基于插件式设计的,除了核心功能外,它所有的扩展功能和设备驱动都是以插件方式加入进来的。 

  基于插件的设计好处很多:把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现。扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布。公开插件接口,让第三方有机会扩展应用程序的功能,有财大家一起发。另外,还可以让开源与闭源共存于一套软件,你的插件是开源还是闭源,完全由你自己决定。 

  基于插件设计并不神秘,相反它比起一团泥的设计更简单,更容易理解。各种基于插件设计的架构都有自己的特色,但从总体架构上看,其模型都大同小异。这里我们介绍一个简单的模型,并给出几个实例,希望对新手有所启发。

  1. 基本架构

plugin.jpg


  插件式设计的应用程序,基本上可以用上图来表示。当然,此图是一种较高层次的表示,实际的设计会更复杂一些。我们在这里为了阐述方便,不用故意搞得那么复杂。

  应用程序由应用程序框架、插件接口、插件和公共函数库四部分组成。 

  应用程序框架负责应用程序的整体运作,它清楚程序整个流程,但并不知道每个过程具体要做什么。它在适当的时候调用一些插件,来完成真正的功能。

  插件接口是一个协议,可能用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感兴趣的朋友,可以到官方网站上去阅读更多的文档。

分享到:
评论

相关推荐

    C# 插件结构设计 C# 插件结构设计

    事件驱动模型可以增强插件架构,允许插件响应主程序或其他插件发出的事件。通过定义事件和事件处理器,可以创建更灵活的交互方式。 9. **版本兼容性** 随着时间推移,主程序和插件可能会有新的版本发布。设计良好...

    插件式GIS应用框架的设计与实现_源码

    总的来说,插件式GIS应用框架的设计与实现涉及多方面的技术,包括软件架构设计、模块化编程、动态加载、API设计以及面向对象编程原则。这样的框架使得GIS系统能够适应不断变化的需求,为用户提供丰富的功能选择,...

    GEF入门实例代码2《Eclipse插件开发》中实例

    总之,通过这个"GEF入门实例代码2",开发者可以了解到如何在Eclipse中构建一个基于GEF的图形编辑器,这不仅涉及数据模型的设计,还包括视图的绘制、用户交互的处理以及可撤销/重做机制的实现。通过实践,开发者可以...

    eclipse 插件 实例01

    Eclipse 插件实例01是一个基于Eclipse RCP(Rich Client Platform)开发的应用程序,展示了如何在Eclipse环境中创建和使用自定义插件。Eclipse RCP是Eclipse IDE的核心组成部分,它允许开发者构建功能丰富的桌面应用...

    Unity CSG 布尔运算插件 模型打孔 模型打洞

    在Unity中,CSG插件提供了这种功能,极大地拓展了游戏物体的设计可能性,尤其适用于制作具有精细结构的游戏环境或道具。 这款在Asset Store上下载的CSG编辑器扩充工具,不仅提供了基本的布尔运算功能,还可能包含了...

    构建插件式的应用程序框架(七)-基本服务

    插件式框架是一种软件架构模式,允许应用程序通过加载外部组件(即插件)来扩展其功能。这种设计使得程序在保持核心功能的同时,可以轻松地增加新功能或更新现有功能,无需修改原始代码。 在构建这样的框架时,我们...

    c#插件式开发demo

    8. **版本兼容性**:在设计插件架构时,要考虑未来版本的兼容性。确保新版本的插件能在旧版本的应用程序中运行,或者旧插件能在新版本的框架下工作。 9. **热更新与热插拔**:理想情况下,插件应支持热更新,即在不...

    C#/WinForm插件程序实例

    了解这些知识点后,你可以尝试解析提供的压缩包文件,查看源代码,理解如何将用户控件与插件架构结合,以及如何在WinForm应用中实现动态加载和事件处理。通过这个实例,你不仅可以学习到C#和WinForm的基本用法,还能...

    插件式GIS应用框架的设计与实现:基于C#和AE+9.2.蒋波涛

    《插件式GIS应用框架的设计与实现:基于C#和AE+9.2》是由蒋波涛编著的一本专业书籍,主要探讨了如何利用C#编程语言和ArcGIS Engine (AE) 9.2这一强大的GIS开发工具,构建灵活、可扩展的GIS应用程序框架。在GIS(地理...

    Java程序设计技巧与开发实例

    本资源“Java程序设计技巧与开发实例”深入探讨了Java编程中的关键技术和实用策略,旨在帮助开发者提升编程效率和代码质量。 首先,Java的设计原则包括“Write Once, Run Anywhere”(一次编写,到处运行),这得益...

    计算机毕业设计-ASP.NET基于BS结构的实验室预约模型系统(源代码+)-毕设源码实例.zip

    计算机毕业设计_ASP.NET基于BS结构的实验室预约模型系统(源代码+)__毕设源码实例.zip计算机毕业设计_ASP.NET基于BS结构的实验室预约模型系统(源代码+)__毕设源码实例.zip计算机毕业设计_ASP.NET基于BS结构的实验室...

    osate插件样例:生成模型评审报告

    标题 "osate插件样例:生成模型评审报告" 涉及的是一个使用OSATE工具进行模型评审的示例,而OSATE是一个基于Eclipse的开源软件架构工具,主要用于建模和分析AADL(Architecture Analysis & Design Language)项目。...

    Linux窗口程序设计—Qt4精彩实例分析(实例源代码)

    12. **设计模式**:Qt4的设计模式,如插件架构和委托模型,可以帮助你构建可扩展和可维护的应用。 实例源代码会涵盖这些概念的实际应用,通过逐个分析并运行这些例子,你可以加深对Qt4的理解,并掌握实际开发中的...

    在C#程序中实现插件架构

    在C#程序中实现插件架构,是一种提升软件灵活性与扩展性的有效手段。本文将深入探讨如何运用C#的独特特性,构建出具有插件机制的可扩展解决方案,并通过实例演示,展示这一机制如何替代传统独立程序,实现更高效的...

    Struts程序设计实例教程

    Struts程序设计实例教程是一本专门针对Java Web开发中的Struts框架进行深入讲解的书籍,尤其适合作为“十一五”国家规划教材使用。作者吴其庆在冶金工业出版社出版了这部著作,旨在帮助读者通过实例学习和掌握Struts...

    插件式应用程序开发(基于LiuZhenHong.Controls控件)

    在IT行业中,插件式应用程序开发是一种常见的设计模式,它允许开发者通过添加或移除插件来扩展程序的功能。这种模式极大地提高了软件的灵活性和可维护性。在本示例中,我们关注的是一个基于 LiuZhenHong.Controls 2....

    3dMax复制粘贴插件

    对于提高工作效率,各种插件的使用是必不可少的,其中“3dMax复制粘贴插件”就是这样一个工具,旨在简化和加速模型之间的复制与粘贴操作。 3ds Max的标准复制粘贴功能虽然基础实用,但在处理复杂场景或大量对象时...

    手机排线FPC设计实例(cad结构图纸+protel 99se布线图纸)

    本教程将通过一个具体的“手机排线FPC设计实例”,探讨如何使用CAD结构图纸和Protel 99SE进行FPC的设计和布线。 首先,CAD结构图纸是FPC设计的基础,它包含了FPC的物理布局和尺寸信息。CAD(Computer-Aided Design...

Global site tag (gtag.js) - Google Analytics