前言:

----IPlugin是PhoneGap框架的通用性接口,通用性接口意味着,众人可以共享的接口。由于通用性(或共享性),框架开发者可以藉单一的通用性接口来<包容>形形×××的特殊性接口;具有标准化接口的<减法设计>效果,但又不会减损特性用户或App对特殊性接口的需求。兼顾标准性和特殊性的,是框架通用性接口设计的重要指标;这是任何框架开发里,都必须面对的高度挑战性任务之一。

从IPlugin接口学习Proxy-Stub设计模式_第1张图片

ee                                                                        ee

欢迎访问 ==>高老师的博客网页

高焕堂:MISOO(大数据.大思考)联盟.台北中心和东京(日本)分社.总教练


EE                                                                        EE

从PhoneGapIPlugin接口,学习Proxy-Stub设计模式

By  高焕堂


1. IPlugin通用性接口

例如,搭配HTML5跨平台的PhoneGap框架里,最常用到的是:IPlugin通用性接口;如下图:


图1、PhoneGap框架里的IPlugin通用性接口

这种通用性接口,通常会规划一个抽像基类来实现它;而这抽像基类里则定义了抽象函数。如下图:

 图2、由Plugin基类来实现IPlugin通用性接口

于是,这个抽象基类担任两项任务:

  • 实现了IPlugin接口,这是提供给众多Client来使用的外部接口。我们以”CI”(Interface for Client)来表示之。

  • 定义了抽象函数,如上图里的execute()函数,成为提供给众多子类别来实现的内部接口。我们以来表示之。

如下图所示:

图3、基类实现CI,并定义

    由子类来实现内部接口。基于PhoneGap的框架,就可以写HTML5/JS模块来调用Java插件(即上图里的myPlugin子类)。在App执行时,用户会使用WebView画面而触发UI事件,JS就负责处理这些事件。必要时,JS会透过WebView(包含幕后的WebKit引擎)调用到IPlugin通用性接口的函数,转而调用Java插件里的execute()函数。如下图:

图4、CI与两个接口的合作

由于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接口。这项技巧是各种框架开发时,经常使用到的。