欢迎访问 ==>高老师的博客网页
高焕堂:MISOO(大数据.大思考)联盟.台北中心和东京(日本)分社.总教练
EE EE
前言:
----IPlugin是PhoneGap框架的通用性接口,通用性接口意味着,众人可以共享的接口。由于通用性(或共享性),框架开发者可以藉单一的通用性接口来<包容>形形×××的特殊性接口;具有标准化接口的<减法设计>效果,但又不会减损特性用户或App对特殊性接口的需求。兼顾标准性和特殊性的,是框架通用性接口设计的重要指标;这是任何框架开发里,都必须面对的高度挑战性任务之一。
ee ee
欢迎访问 ==>高老师的博客网页
高焕堂:MISOO(大数据.大思考)联盟.台北中心和东京(日本)分社.总教练
EE EE
从PhoneGap的IPlugin接口,学习Proxy-Stub设计模式
By 高焕堂
1. IPlugin通用性接口
例如,搭配HTML5跨平台的PhoneGap框架里,最常用到的是:IPlugin通用性接口;如下图:
图1、PhoneGap框架里的IPlugin通用性接口
这种通用性接口,通常会规划一个抽像基类来实现它;而这抽像基类里则定义了抽象函数。如下图:
图2、由Plugin基类来实现IPlugin通用性接口
于是,这个抽象基类担任两项任务:
实现了IPlugin接口,这是提供给众多Client来使用的外部接口。我们以”CI”(Interface for Client)来表示之。
定义了抽象函数,如上图里的execute()函数,成为提供给众多子类别来实现的内部接口。我们以<I>来表示之。
如下图所示:
图3、基类实现CI,并定义<I>
由子类来实现内部接口<I>。基于PhoneGap的框架,就可以写HTML5/JS模块来调用Java插件(即上图里的myPlugin子类)。在App执行时,用户会使用WebView画面而触发UI事件,JS就负责处理这些事件。必要时,JS会透过WebView(包含幕后的WebKit引擎)调用到IPlugin通用性接口的函数,转而调用Java插件里的execute()函数。如下图:
图4、CI与<I>两个接口的合作
由于IPlugin接口只提供单一函数:execute();使得PhoneGap也只能提供单一函数:exec()。
2. 通用性接口与Proxy-Stub设计模式
然而,在HTML5_JS里可能有多个函数,例如play()和stop()等。于是,在HTML5_JS里,必须从play()函数转而调用PhoneGap.exec()函数。[歡迎光臨 高煥堂 網頁: http://www.cnblogs.com/myEIT/ ]
这个PhoneGap.exec()再透过WebView而呼叫到IPlugin.execute()。如果我们在上述架构里面,加上一个myProxy类别,它包装了PhoneGap.exec()函数,扮演Java Plugin的Proxy(代理者)角色,如下图所示:
图5、Proxy类将特殊性接口转为通用性接口
此时,HTML5_JS里面就看不到PhoneGap.exec()函数了,其好处是:
一方面让HTML5_JS程序代码比较单纯;
另一方面,让HTML5_JS与PhoneGap.exec()两者相依性(Dependency)降低,让HTML5_JS不受制于PhoneGap的框架界面。也因而提升了PhoneGap框架接口的变动自由度。
通常,在框架设计里,myProxy和myStub会是成对的,这称为Proxy-Stub模式。如下图所示:
图6、Stub类则从通用性接口转换到特殊性接口
于此,你已经观摩了如何使用proxy-stub模式来封装PhoneGap.exec()界面。除了PhoneGap框架之外,在Android框架里,也使用同样的技巧来封装跨进程的IBinder接口。这项技巧是各种框架开发时,经常使用到的。◆
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。