本文参考于:
设计模式课程
设计模式之适配器模式javascript
设计模式是一套被反复使用的、多数人知晓的、通过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石同样。项目中合理地运用设计模式能够完美地解决不少问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在咱们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被普遍应用的缘由。java
设计模式如此强大,从今天开始,抓住大学生活的尾巴,我要一天学习一个设计模式啦。设计模式
第一个设计模式是:适配器模式。less
使用场景:
1 系统须要使用现有的类,而这些类的接口不符合系统的须要。
2 想要创建一个能够重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在未来引进的类一块儿工做。
3 须要一个统一的输出接口,而输入端的类型不可预知。
好比插座-充电器-电子设备的例子。插座输出的是220V的电压,而电子设备充电时只需5V,否则就note7了,这时充电器充当适配器,接受插座的220V,输出5V,从而做为链接器让电子设备顺利充电。
总的来讲适配器就是src-adapter-dist的模式,与修饰模式直接无感使用src不一样,适配器模式使用对象变为adapter。
适配器模式不是在系统设计时所预期的,是在需求改动、升级的时候动态添加的,若是一个系统使用过多的适配器,明明调用的是A接口,却在适配器内部实现的是调用B接口,致使系统混乱。学习
适配器模式分为三种:
1、类适配器模式;2、对象适配器模式;3、接口适配器模式(JS没有抽象类的概念,这里不详细讲述)this
接下来举的例子就是上面插座-充电器-电子设备的例子。.net
继承src,实现dist的接口。
先是插座prototype
function Plug() { this.V = 220; } Plug.prototype.outputVoltage220 = function() { return this.V; };
再是手机设计
function Phone() { this.V = 5; } Phone.prototype.charge = function(outputDevice) { if (outputDevice.outputVoltage5() === this.V) { console.log('充电中...'); } else { console.log('充电异常'); } };
如今咱们要实现的是outputVoltage5的接口,以对接手机的输入电压code
function inherit(Sub, Sup) { Sub.prototype = Object.create(Sup.prototype); Object.defineProperty(Sub.prototype, 'constructor', { enumerable: false, value: Sub }); } function Charger() { Plug.call(this); } inherit(Charger, Plug); Charger.prototype.outputVoltage5 = function() { return this.outputVoltage220() / 44; };
这样充电器就实现了链接插座和手机的功能。
var cg = new Charger(); var mobile = new Phone(); mobile.charge(cg);
小结:类适配器使用继承的方式实现,会暴露src的全部其余方法。
对象适配器和类适配器相差不大,使用组合的方式实现。
持有src,实现dist接口,完成src->dist的适配
function Charger2() { this.plug = null; } Charger2.prototype.initPlug = function(plug) { return this.plug = plug; }; Charger2.prototype.outputVoltage5 = function() { if (!this.plug) { console.error('未插电'); return -1; } return this.plug.outputVoltage220() / 44; };
一样也能正常充电
var plug = new Plug(); var cg2 = new Charger2(); cg2.initPlug(plug); mobile.charge(cg2);
小结:根据合成复用原则,组合优于继承,因此结构型模式通常都是对象结构型模式。
以上表述有什么问题,欢迎你们指出,一块儿学习。