对Javascript系列(39)的深入理解:设计模式适配器模式的详细解决方案
适配器模式(适配器)是一个类(对象)接口(或属性)到另一个接口到客户需要(或属性),适配器模式造成的,因为不兼容的接口不能与这些类(对象)一起工作。
文本
我们给一个飞鸭例(码头)(粉)和嘎嘎(嘎嘎)的行为,和土耳其也飞(飞)的行为,但声音咯咯笑(餐桌)。如果你想有一个土耳其嘎嘎(嘎嘎)这一行动,庸医的方法我们可以重用的鸭子,但具体的电话也应该开始了,在这一点上,我们可以创建一个适配器的火鸡,火鸡还支持嘎方法,部叫餐桌。
好的,我们一步一步地开始,首先定义鸭子和土耳其的抽象行为,即每个方法的功能。
复制代码代码如下所示:
鸭
var =函数(){()
};
duck.prototype.fly =函数(){
抛出新错误()必须重写该方法!;
};
duck.prototype.quack =函数(){
抛出新错误()必须重写该方法!;
}
土耳其
var =函数(){()
};
turkey.prototype.fly =函数(){
抛出新错误()必须重写该方法!;
};
turkey.prototype.bble =函数(){
抛出新错误()必须重写该方法!;
};
然后对特定的鸭子和火鸡的构造分别进行了重新定义:
复制代码代码如下所示:
鸭
Var MallardDuck =函数(){()
Duck.apply(本);
};
mallardduck.prototype =新(鸭); / /鸭原型
(MallardDuck.prototype.fly函数){
console.log(可以飞很长的距离!;
};
(mallardduck.prototype.quack =功能){
console.log(加加!Gaga!;
};
土耳其
Var WildTurkey =函数(){()
Turkey.apply(本);
};
wildturkey.prototype =新(土耳其); / /土耳其原型
(wildturkey.prototype.fly =功能){
console.log(飞行的距离似乎短了一点!)
};
(wildturkey.prototype.bble =功能){
console.log(咯咯!扔出!;
};
让土耳其也支持庸医的方法,我们创建了一个新的土耳其适配器,TurkeyAdapter:
复制代码代码如下所示:
无功turkeyadapter =功能(oturkey){
Duck.apply(本);
this.oturkey = oturkey;
};
turkeyadapter.prototype =新鸭();
turkeyadapter.prototype.quack =函数(){
This.oTurkey.bble();
};
turkeyadapter.prototype.fly =函数(){
无功nfly = 0;
无功nlenfly = 5;
为(;;nfly < nlenfly;){
This.oTurkey.fly();
nfly = nfly + 1;
}
};
构造函数接受一个土耳其实例对象,然后用鸭子做申请,其适配器的原型是鸭子,然后修改其原型嘎方法,为了给oturkey.bble()内部。苍蝇的方法也作了一些修改,允许土耳其飞5次(内部也叫自己的oturkey.fly()方法)。
调用方法非常清晰,测试将能够知道结果。
复制代码代码如下所示:
无功omallardduck =新MallardDuck();
无功owildturkey =新WildTurkey();
无功oturkeyadapter =新TurkeyAdapter(owildturkey);
鸭/原始行为
OMallardDuck.fly();
OMallardDuck.quack();
最初的行为/土耳其
OWildTurkey.fly();
OWildTurkey.bble();
土耳其的行为(土耳其)
OTurkeyAdapter.fly();
OTurkeyAdapter.quack();
总结
这是使用适配器模式的好方法吗如果有下列情况,建议使用:
1。使用已经存在的对象,但它的方法或属性接口不符合您的要求;
2、您希望创建一个可重用对象,该对象可以与其他不相关的对象或不可见对象(即与接口方法或属性不兼容的对象)一起工作。
三.要使用现有的对象,但不能继承每个原型来匹配它的接口。
此外,适配器模式和其他一些模式可能很容易混淆。这里有一些一般性的差异:
1、虽然适配器和桥接模式相似,但桥接的起点不同。桥接的目的是将接口部分与实现部分分开,以便它们可以更容易地、相对独立地改变。
2、装饰模式在不改变接口的情况下增强了其他对象的功能,因此其透明性优于适配器。结果是,装修支持递归组合,而纯粹使用适配器是不可能的。
3。代理模式为另一个对象定义代理而无需更改其接口。