[设想形式][面板形式][Javascript]

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]》

类图

《[设想形式][面板形式][Javascript]》

事情中的现实案例,所以对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();

参考

    原文作者:leewind
    原文地址: https://segmentfault.com/a/1190000000644921
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞