第六章 设计模式 - 结构型 - 适配器模式

发布时间 2023-03-28 15:48:15作者: caix-1987

适配器模式的概念

适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户希望的另外一个接口(方法或属性)

适配器模式使得原本由于接口不兼容而不能一起工作的那些类(对象)可以一些工作。

适配器又称包装器(wrapper)。

核心就是 适配 做 兼容性 处理

适配器模式示例代码

// typetypec耳孔
class Cellular{
   charge(){
       return 'typec耳孔'
   }
}

// 适配器转换为普通耳机孔
class Adaptor{
   constructor(){
       this.Cellular = new Cellular()
   }
   charge(){
       let v = this.Cellular.charge() 
       return `${v}=>普通耳机圆孔`
   }
}

// 然后就能正常使用了
class Headset{
   constructor(){
       this.Adaptor = new Adaptor()
   }
   use(){
       console.log(this.Adaptor.charge())
   }
}

let headset = new Headset()
headset.use()

适配器模式的场景

1、在平时我们开发中,我们可能会遇见这样的场景:当我们试图调用某个模块或者对象的接口时,却发现这个接口的格式不符合我们的需求。这时有两种解决办法:第一种是修改原来的接口实现,但如果原来的代码很复杂,例如是一个库或框架,更改原代码就显得很不现实了。所以这时就需要使用今天所讲的第二种办法:创建一个适配器,将原接口转换为客户希望的另一个接口,客户只需要使用适配器即可。

2、比如我们需要请求后端数据,但我们默认请求的方法是GET请求,但后端用的是post请求, 还有后端返回的数据格式是字符串的,但我们需要的是对象类型的数据,因此前端就需要做兼容处理

  1、对请求参数的适配
  
  2、对后端返回的数据进行适配
  
function ajax(options){
    let defaultOptions = {
        methods:'GET',
        dataType:'json'
    }
    
    for(let attr in options){
        // 这里对请求参数做了适配
        defaultOptions[attr] = options[attr] || defaultOptions[attr]
    }

}
function transform(str){
    return JSON.parse(str)
}
ajax({
    url:'http://www.baidu.com',
    methods:'post',
    success(str){
        // 服务器返回来的是一个纯的json字符串
        // 我们可以转换成我们想要的格式
        let result = transform(str)
    }
})

适配器模式的总结其一

小结

  不改变原有接口的情况下,统一接口、统一入参、统一出参、统一规则,符合开发封闭原则。

使用场景

  拥抱变化,兼容代码。

适配器模式的总结其二

优点

  1、可以让任何两个没有关联的类一起运行。
  
  2、提高了类的复用。
  
  3、适配对象,适配库,适配数据

缺点

  1、额外对象的创建,非直接调用,存在一定的开销( 且不像代理模式在某些功能点上可实现性能优化 )
  
  2、如果没必要使用适配器模式的话,可以考虑重构,如果使用的话,尽量把文档完善

场景

  1、整合第三方SDK
  
  2、封装旧接口