一、定義
將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口,使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作荷并。
使用場(chǎng)景:
1、使用一個(gè)已經(jīng)存在的對(duì)象富玷,但其方法或?qū)傩越涌诓环衔覀兊囊蟆?br>
2璧坟、想要?jiǎng)?chuàng)建一個(gè)可復(fù)用對(duì)象,該對(duì)象可以與其他不相關(guān)的對(duì)象或不可見(jiàn)的對(duì)象協(xié)同工作
3赎懦、想使用的對(duì)象已經(jīng)存在雀鹃,但是不能對(duì)每一個(gè)都進(jìn)行原型繼承以匹配它的接口。對(duì)象適配器可以適配它的父對(duì)象接口方法或?qū)傩浴?/p>
二励两、舉例
eg1: github上面原有的例子(https://github.com/sohamkamani/javascript-design-patterns-for-humans#-composite)黎茎。
// 場(chǎng)景:一個(gè)有獵人的游戲,獵人獵殺獅子--符合使用場(chǎng)景1
// 不同類(lèi)型的獅子吼叫
class AfricanLion {
roar () {}
}
class AsianLion {
roar () {}
}
// 搜索不同的獅子進(jìn)行獵殺
class Hunter {
hunt(lion) {
// ... some code before
lion.roar()
//... some code after
}
}
// 獵人也要追捕狗 但此時(shí)界面是不同的当悔,為了與獵人兼容 需要?jiǎng)?chuàng)建一個(gè)兼容的適配器
class WildDog {
bark () {}
}
class WildDogAdapter {
constructor(dog) {
this.dog = dog;
}
roar() {
this.dog.bark();
}
}
// 調(diào)用
wildDog = new WildDog()
wildDogAdapter = new WildDogAdapter(wildDog)
hunter = new Hunter()
hunter.hunt(wildDogAdapter)
eg2:參數(shù)適配
// 參數(shù)適配模擬eg1:
function add (x1, x2, x3) {
console.log(x1 + x2 + x3);
}
// 存在一個(gè)對(duì)象數(shù)據(jù)
var obj = {
a: '我',
b: '很',
c: '帥'
}
function adapter (o) {
// 通過(guò)適配器函數(shù)來(lái)調(diào)用目的api
add(o.a, o.b, o.c);
}
adapter(obj);
// 參數(shù)適配eg2: 項(xiàng)目中調(diào)用接口
fetchCompanyWalletComponent (componentType, authType, orderCode = '', jrId='') {
let param = { componentType, authType, orderCode, jrId }
$http.fetchCompanyWalletApi(param).then(data => {
window.location.href = data.data
})
}
// fetchCompanyWalletApi接口
fetchCompanyWalletApi(param) {
let url = 'xxxxx'
return $http.post(url, param)
},
eg3:數(shù)據(jù)的適配
// 使用Echarts折線(xiàn)圖對(duì)網(wǎng)站每周的uv傅瞻,通常后端返回的數(shù)據(jù)格式如下
[
{
"day": "周一",
"uv": 6300
},
{
"day": "周二",
"uv": 7100
}, {
"day": "周三",
"uv": 4300
}, {
"day": "周四",
"uv": 3300
}, {
"day": "周五",
"uv": 8300
}, {
"day": "周六",
"uv": 9300
}, {
"day": "周日",
"uv": 11300
}
]
// Echarts需要的x軸的數(shù)據(jù)格式和坐標(biāo)點(diǎn)的數(shù)據(jù)是長(zhǎng)下面這樣的:
["周二", "周二", "周三", "周四"盲憎, "周五"嗅骄, "周六", "周日"] //x軸的數(shù)據(jù)
[6300. 7100, 4300, 3300, 8300, 9300, 11300] //坐標(biāo)點(diǎn)的數(shù)據(jù)
// 將后端的返回?cái)?shù)據(jù)做適配
//x軸適配器
function echartXAxisAdapter(res) {
return res.map(item => item.day);
}
//坐標(biāo)點(diǎn)適配器
function echartDataAdapter(res) {
return res.map(item => item.uv);
}
三饼疙、總結(jié)
適配器模式在JS中的使用場(chǎng)景很多溺森,基本思想就是用一個(gè)新的接口對(duì)現(xiàn)有的接口進(jìn)行包裝,處理類(lèi)與API的不匹配。
優(yōu)點(diǎn):
1屏积、將目標(biāo)類(lèi)和適配者類(lèi)解耦
2医窿、增加了復(fù)用性和擴(kuò)展性
缺點(diǎn):
過(guò)多地使用適配器,會(huì)讓系統(tǒng)非常零亂炊林,不易整體進(jìn)行把握姥卢。
(比如,明明看到調(diào)用的是 A 接口渣聚,其實(shí)內(nèi)部被適配成了 B 接口的實(shí)現(xiàn)独榴,一個(gè)系統(tǒng)如果太多出現(xiàn)這種情況,無(wú)異于一場(chǎng)災(zāi)難奕枝。)