JavaScript设计模式_14_适配器模式
适配器模式是一种相对简单的设计模式,它的出现主要是为了解决两个软件接口不统一的问题。
/** * pre:适配器模式 */ //----------- 示例1 ---------- /** * 有一个地图渲染器,可以渲染百度地图,也可以渲染谷歌地图。 * 但百度地图提供的接口是display方法,谷歌是show方法,为了统一,我们写一个百度地图适配器。 * 代码如下: */ var googleMap = { show: function() { console.log("谷歌地图."); } }; var baiduMap = { display: function() { console.log("百度地图."); } }; var baiduMapAdapter = { show: function() { baiduMap.display(); } }; var renderMap = function(map) { if(map.show instanceof Function) { map.show(); } }; renderMap(googleMap); renderMap(baiduMap);// 会报错 renderMap(baiduMapAdapter);// 执行正常 //---------- 示例2 ------------ /** * 某天我们从第三方资源获取了广东省一些城市的信息,并将它们渲染在地图上, * 代码如下: */ var getGuangdongCity = function() { var guangdongCity = [{ name: "shenzhen", id: 11 }, { name: "guangzhou", id: 12 }, { name: "zhuhai", id: 13 }]; return guangdongCity; }; var render = function(fn) { console.log("开始渲染地图."); document.writeln(JSON.stringify(fn())); }; render(getGuangdongCity); /* 过了两天,我们又获取了广东省更新更全的数据,要求格式为: * var guangdongCity = { * shenzhen:11, * guangzhou:12, * zhuhai:13, * jiangmen:14 * } * 我们写一个适配器用于转换为新的数据格式,如下: */ var addressAdapter = function(oldAddressfn) { var address = {}, oldAddress = oldAddressfn(); for(var i = 0, a; a = oldAddress[i++];) { address[a.name] = a.id; } return function() { return address }; }; render(addressAdapter(getGuangdongCity));
作者:『Stinchan』
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。