《设计模式之适配器模式》

186 阅读2分钟

定义

将一个类(对象)的接口(方法或者属性)转化成另外一个接口以满足用户需求,使类(对象)之间接口的不兼容问题通过适配器得以解决

问题思考

假设我们有鸟和鱼两个类,鸟有一个飞行的方法,鱼有游的方法。现在我们想让鱼的游泳飞行的效果该怎么做

方案

我们利用设配器模式来完成上面的需求

<!-- 鸟类 -->
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语法来完成

总结

那合适使用适配器模式好呢?如果有以下情况出现时,建议使用:

  1. 使用一个已经存在的对象,但其方法或属性接口不符合你的要求;
  2. 你想创建一个可复用的对象,该对象可以与其它不相关的对象或不可见对象(即接口方法或属性不兼容的对象)协同工作;
  3. 想使用已经存在的对象,但是不能对每一个都进行原型继承以匹配它的接口。对象适配器可以适配它的父对象接口方法或属性。