作者:1234 | 来源:互联网 | 2023-09-10 10:14
TheFacadePatternisanobjectthatprovideasimplifiedinterfacetoalargerbodyofcode,suchasaclassl
The Facade Pattern is an object that provide a simplified interface to a larger body of code, such as a class library. A Facade can
+ make a software library easier to use, understand and test, since the facade has convenient methods for common tasks
+ make the library more readable, for the same reason;
+ reduce dependencies of outside code on the inner working of a library, since most code uses the facade, thus allowing more flexibility in developing the system
+ wrap a poorly designed collection of APIs with a single well-designed API
From http://en.wikipedia.org/wiki/Facade_pattern
定义
表面形式的目的是为子体系供应一个一致的”界面”,定义了一个高层的接口,这个接口使得这一子体系越发轻易运用
客户假如直接运用子体系,须要对子体系“晓得”的更多,“晓得”自身就增加了耦合
在子体系上笼统出一个面板层,面板层是对子体系爆前途的接口的包装。关于客户来讲只须要晓得面板层,而不须要晓得被面板层包装的子体系,从而下降耦合。
假如有一天替换子体系,一样的只需笼统出一致的面板层,对客户来讲挪用没有发生变化。
需求
关于智能手机的开辟,新鼓起一种Hybrid开辟,在手机App中嵌入web,经由过程Javascript与手机底层的通讯,来完成web自身不能完成的功用
- native层须要暴露出一组大众的接口,web层经由过程挪用这些接口到达一样的事情目的
![《[设想形式][面板形式][Javascript]》](http://ddrvcn.oss-cn-hangzhou.aliyuncs.com/2019/8/AJVFVn)
类图
![《[设想形式][面板形式][Javascript]》](http://ddrvcn.oss-cn-hangzhou.aliyuncs.com/2019/8/EV7Zbq)
事情中的现实案例,所以对Hybrid这里的设想搀杂了桥接形式和面板形式两种,别的还有些挪动端Hybrid的学问补充。
关于Hybrid的学问,别的有文档补充,简单说一下,Hybrid中心的URL Scheme,关于URL Scheme能够参考这篇文章,很尖锐:http://xujiwei.com/blog/2011/09/ios-app-custom-url-scheme-design/
关于URL Scheme的支撑,Android从4.4最先,IOS最先的版本较早,未考据。能够把url schem看作是暴露出来的API,把native底层看作是一个子体系,所以须要构建UrlSchemeFacade来封装子体系露出来的接口。
HybridBridge职责是从UrlSchemeFacade中猎取接口,挪用对应的效劳。
在Native层,实在也做了一个Facade的设想,它把各个模块看作是子体系,然后举行封装出须要的URL Scheme
角色
- UrlSchemeFacade (Facade): Native供应的Url Scheme的面板
完成
var prototype = require('prototype');
var UrlSchemeFacade = prototype.Class.create({
nativeInterfaceMap: {
'geo.locate': 'ctrip://wireless/geo/locate',
'device.info': 'ctrip://wireless/device/info'
},
getUrlScheme: function(key) {
return this.nativeInterfaceMap[key];
}
});
UrlSchemeFacade.API = {
'GEOLOCATE':'geo.locate',
'DEVICEINFO': 'device.info'
}
var HybridBridge = prototype.Class.create({
initialize: function(facade) {
this.urlSchemeFacade = facade;
},
request: function(api) {
var url = this.urlSchemeFacade.getUrlScheme(api);
console.log(url);
// @todo 挪用url scheme
// window.location.replace = url;
}
});
var Main = function () {
var urlSchemeFacade = new UrlSchemeFacade();
var hybridBridge = new HybridBridge(urlSchemeFacade);
hybridBridge.request(UrlSchemeFacade.API.GEOLOCATE);
}
Main();
参考
- http://baike.baidu.com/view/1151448.htm
- http://www.cnblogs.com/kid-li/archive/2006/07/10/446904.html
- http://en.wikipedia.org/wiki/Facade_pattern