适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作。速成包装器(wrapper)。
适配器模式的3个角色
1.目标角色:该角色定义把其他类转换为何种接口,也就是我们的期望接口
2.源角色 你想把谁转换成目标角色,这个‘谁就是源角色
3.适配器角色 适配器模式的核心角色 其他两个角色都是
优点:
1.可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们
2.增加了类的透明性
3.提高了类的复用度
4.灵活性非常好
适配器模式的使用场景
你有动机修改一个已经投产中的接口时,适配器模式可能是最适合你的模式。比如系统扩展了,需要使用一个已有或者新建立的类,但这个类又不符合系统的接口怎么办,使用适配器模式
适配器注意事项:
适配器在详细设计阶段不要考虑它,他不是为了解决还在开发阶段的问题,而是解决正在服役的项目问题。系统扩展了,不符合原有设计的时候才会考虑通过适配器模式减少代码修改带来的风险
分为两类:
1.对象适配器, 通过类间的关联关系进行耦合
2.类适配器 只能通过复写源角色的方法进行扩展
实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>适配器</title>
</head>
<body>
<script>
//鸭子
var Duck = function () {
}
Duck.prototype.fly=function () {
console.log("鸭子可以飞");
}
Duck.prototype.quack = function () {
console.log("鸭子嘎嘎叫");
}
//火鸡
var Turkey = function () {
}
Turkey.prototype.fly = function () {
console.log("火鸡可以飞");
}
Turkey.prototype.gobble = function () {
console.log("火鸡咯咯叫");
}
//适配器角色
var TurkeyAdapter = function(oTurkey){
Duck.apply(this);
this.oTurkey = oTurkey;
};
TurkeyAdapter.prototype = new Duck();
TurkeyAdapter.prototype.quack = function(){
this.oTurkey.gobble();
};
TurkeyAdapter.prototype.fly = function(){
var nFly = 0;
var nLenFly = 5;
for(; nFly < nLenFly;){
this.oTurkey.fly();
nFly = nFly + 1;
}
};
var oMallardDuck = new Duck();
var oWildTurkey = new Turkey();
var oTurkeyAdapter = new TurkeyAdapter(oWildTurkey);
//原有的鸭子行为
oMallardDuck.fly();
oMallardDuck.quack();
//原有的火鸡行为
oWildTurkey.fly();
oWildTurkey.gobble();
//适配器火鸡的行为(火鸡调用鸭子的方法名称)
oTurkeyAdapter.fly();
oTurkeyAdapter.quack();
</script>
</body>
</html>