什么是适配器模式
网上我也看了很多资料,想弄得js的设计模式,发现看得云里雾里,可能是自己的水平还不够深。 最近我看了适配器模式。发现我们平常工作中用得其实很多,只是从来没有去留意过是什么模式
- 那到底什么是适配器模式呢?
适配器模式(Adapter)是将一个类(对象)的接口(方法或属性)转化成客户
希望的另外一个接口(方法或属性),适配器模式使得原本由于接口不兼容而不
能一起工作的那些类(对象)可以一些工作。又称包装器(wrapper)。
初次看上面的一段文字,有点生涩难懂,心想这写的是啥,心里一万马奔腾。 那我们先打个比方在看上面的文字描述,可能你就懂了:
最近新买了一台手机,坐在车上突然想听歌,因为我有点晕车,希望通过听歌来转移注意力,拿出以前的耳机打算插上手机耳机孔,找了半天,我擦,这什么鬼,耳机孔都没有,这怎么听歌,然后问了客服(客户肯定在一万个白眼飘过),请原来我是手机小白,原来我买的手机听歌的地方就是充电的地方 ,是用typec接口插耳机的,可这时我又没有这种耳机,于是我机智的在某宝上买了如下的转接头,插上我原来的耳机,我又能愉快的听歌了,好高兴啊。
看到这,我想大家也知道了,就是原来我的耳机不兼容我现在的手机,然后需要用个转接头才能再次使用我原来的耳机。
适配器代码的实现
下面这是一段实现上面例子的代码
// 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()
适配器应用的场景?
在平时我们开发中,我们可能会遇见这样的场景:当我们试图调用某个模块或者对象的接口时,却发现这个接口的格式不符合我们的需求。这时有两种解决办法:第一种是修改原来的接口实现,但如果原来的代码很复杂,例如是一个库或框架,更改原代码就显得很不现实了。所以这时就需要使用今天所讲的第二种办法:创建一个适配器,将原接口转换为客户希望的另一个接口,客户只需要使用适配器即可。
比如我们需要请求后端数据,但我们默认请求的方法是GET请求,但后端用的是post请求, 还有后端返回的数据格式是字符串的,但我们需要的是对象类型的数据,因此前端就需要做兼容处理
- 对请求参数的适配
- 对后端返回的数据进行适配
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)
}
})