大话设计模式(三) - 适配器模式
定义与应用
适配器在现实场景中其实有很多, 电源的适配器, USB串口桥接到Mac Pro 上到TYPE-c 接口上,在现实生活中几乎无处不在,同样的,在计算机程序中,为了适配不同架构的机器,兼容不同的浏览器厂商,通过增设适配器的写法,达到兼容的目的。
经典名言
没有什么程序是加一层抽象解决不了的,那么适配器就可以是这个抽象。
优点
适配器是由于架构,机器设备的不统一产生的产物,有以下优点。
-
让两个毫无关联的类or 实例运行。
-
提高类的复用,(因为都在同一个类下,提高类的复用 可以复用其方法)
-
灵活度提高。(由于类的定义更加松散了,可以任意适配)
缺点
上面说到了适配器是架构与机器设配没有统一标准造成的,由于太松散,往往会导致适配器过于庞大,适配器需要兼容各种各样的情形,会导致适配器代码难以维护。
过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
代码实现
var googleMap = { show:function(){ console.log('开始渲染谷歌地图'); } }; var baiduMap = { display:function(){ console.log('开始渲染百度地图'); } };// 百度地图的适配器 将百度地图的show方法适配到map show上 var baiduMapAdapter = { show:function(){ return baiduMap.display(); } }; var renderMap = function(map){ if(map.show instanceof Function){ map.show(); } }; renderMap(googleMap); //输出:开始渲染谷歌地图 renderMap(baiduMapAdapter); //输出:开始渲染百度地图
每日一道算法题
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
例:
输入:coins = [1, 2, 5], amount = 11输出:3 解释:11 = 5 + 5 + 1
输入:coins = [2], amount = 3输出:-1
tips: 动态规划 贪心算法
awosome
-
尤大从0开始教你写vue源码 www.bilibili.com/video/BV1my…
-
前端面试题汇总 github.com/lgwebdream/…
-
实用的绘图工具 github.com/fabricjs/fa…(提供转json 转svg 转图片等基础功能,帮你快速实现一个类ps的图片编辑器)
另外关注我的公众号每天推送一篇设计模式