定义
将一个类(对象)的接口(方法或者属性)转化成另外一个接口以满足用户需求,使类(对象)之间接口的不兼容问题通过适配器得以解决
问题思考
假设我们有鸟和鱼两个类,鸟有一个飞行的方法,鱼有游的方法。现在我们想让鱼的游泳飞行的效果该怎么做
方案
我们利用设配器模式来完成上面的需求
<!-- 鸟类 -->
function Bird(){
}
Bird.prototype.fly = function (){
console.log('bird fly')
}
<!-- 鱼类 -->
function Fish(){
}
Fish.prototype.swim = function (){
console.log('fish swim')
}
<!-- 鱼适配器 -->
function FishAdapter(bird){
this.bird = bird
}
FishAdapter.prototype = new Fish();
FishAdapter.prototype.swim = function (){
this.sbird.fly()
}
<!-- 代码测试 -->
let bird = new Bird();
let fish = new Fish();
bird.fly()
fish.swim()
let fishAdapter = new FishAdapter(bird)
fishAdapter.swim()
列举应用场景
其实我们在工作中很不然的就使用了适配器模式
比如说我们现在一个项目已经上线了是使用的公司内部开发的M框架,但是由于一些原因,想使用jquery框架提供的服务,但是还不能改变已经上线的代码。
<!-- M 框架下通过属性选择 -->
M.get(s){
return document.querySelectorAll(s)
}
<!-- jq下 -->
$(s)
<!-- 适配器模式下 -->
M.get(s){
return $(s)
}
再比如,函数标准参数的适配
function fun(option){
let defaultOption = {
a:1,
b:2,
c:1
}
let op = {
a:option.a || defaultOption.a,
b:option.b || defaultOption.b,
c:option.c || defaultOption.c,
}
//do something
}
函数的参数适配现在也可以利用es6语法来完成
总结
那合适使用适配器模式好呢?如果有以下情况出现时,建议使用:
- 使用一个已经存在的对象,但其方法或属性接口不符合你的要求;
- 你想创建一个可复用的对象,该对象可以与其它不相关的对象或不可见对象(即接口方法或属性不兼容的对象)协同工作;
- 想使用已经存在的对象,但是不能对每一个都进行原型继承以匹配它的接口。对象适配器可以适配它的父对象接口方法或属性。