2016-10-13 00:16:48 点击量:7 标签: 收藏本文
插件式开发是我非常喜欢的一种设计模式。实际工作中,对某一产品,经常因时间和场景的不同,需要不同的功能。比如,视频播放器,有时候需要包含贴片 广告、更多推荐的全功能版本,有时候只需要播视频的基础功能;再比如一款在线游戏,可能圣诞需要上线一个活动,春节又希望上线另一个活动,但是两个活动的 逻辑和功能可能完全不同,而且活动下线之后,里面的逻辑和功能可能再也用不上了。
通常情况下,我们可以开发一个“完整功能版本”,这个版本发布后拥有所有可能用到的功能,我们通过某种开关对功能进行控制,避免太多功能分散用户注 意力的同时,也保证功能更有说服力。但是这样做的话,会使代码量快速膨胀,软件结构臃肿,单个类容纳的功能越来越多,行数也越来越多;与此同时,用户每次 都要下载包含所有功能的逻辑,很多内容可能他根本用不到。这即浪费了用户的时间,也消耗了我们的带宽。
于是,为了解决这些问题,我们可以求助插件式开发。
我根据自身理解,为以后的文章做出一些约定:
上面这些是主要思路。因为应用场景不尽相同,具体实现起来肯定千差万别,不过大体结构应该是相似的,只是组合方式不同。接下来,我开始从代码层面上,解析插件模式的做法。
首先我们需要在主体里植入一些类,来支持插件模式。它可能包含以下几个:
- PluginManager
- 单例
- 用来管理插件的加载、构造、销毁,当发生数据交互的时候,model部分也会将数据交给它来过滤和分发
- 可能还要显示插件加载的进度
- 处理通用错误
- createPlugin(pid:String, vo:PluginVO); //通过配置文件里的内容创建插件
- getPlugin(pid:String); //取得插件
- refreshPluginsData(obj:Object); //更新所有插件的数据
- removePlugin(pid:String); //移除插件
- destroyPlugin(pid:String); //销毁插件
- PluginLoader
- 单例
- 用来处理插件的加载、卸载过程
- loadPlugin(pid:String, vo:PluginVO); //加载插件
- unloadPlugin(pid:String); //卸载加载到的插件
- PluginVO
- 单个插件的数据,如id、类路径、权限等等
- 一般由配置文件生成
- IPlugin
- 插件接口,由PluginManager来处理基础交互
- install(vo:PluginVO) //安装,通知它可以与外界进行交互了
- fill(data:Object) //填充数据,Install之后调用
- refresh(data:Object) //更新数据,fill之后需要刷新数据时调用
- destroy() //摧毁,确定插件不再需要的时候调用
那些具体的方法可能未必需要,也可能还有些方法未能写全。不过没关系,后面,我将结合实例,讨论插件的具体实现方式。
我们是一家提供综合软件外包与弱电工程服务的技术公司。
业务涵盖定制软件、管理系统、网站、小程序、APP、系统集成、网络布线、监控安防、门禁、机房建设及长期技术维护。
公司地址:湖北省宜昌市伍家岗区东站二路6号三峡(宜昌)大数据产业园海洋馆二楼A203室