適配器模式:將一個類(對象)的接口(方法或屬性)轉化成客戶但願的另一個接口(方法或屬性),使得本來因爲接口不兼容而不能一塊兒工做的那些類(對象)能夠正常協做。簡單理解就是爲兼容而生的 「轉換器」。javascript
對於強迫症患者,那麼多形狀各異的接口,對應着不一樣數據線。若是能夠有一個轉接口實現集合兼容,豈不美哉。沒錯,這樣一個適配器,你值得擁有。(各大廠商加把勁。。。)html
生活小栗子:java
實現方式:在不改變原有對象接口的基礎上,定義一個包裝對象,新對象轉接調用原有接口,使外部調用者能夠正常使用。git
// 適配器實現地圖SDK統一渲染
var googleMap = {
show: function(){
console.log('開始渲染谷歌地圖');
}
};
var baiduMap = {
display: function(){
console.log('開始渲染百度地圖');
}
};
// 外部實際調用的適配器對象
var baiduMapAdapter = {
show: function() {
return baiduMap.display();
}
};
// 外部調用者
var renderMap = function(map) {
map.show(); // 統一接口調用
};
renderMap(googleMap);
renderMap(baiduMapAdapter);
複製代碼
// 使用ES6改寫適配器實現地圖SDK統一渲染
class googleMap {
show() {
console.log('開始渲染谷歌地圖');
}
}
class baiduMap {
display() {
console.log('開始渲染百度地圖');
}
}
class baiduMapAdapter extends baiduMap {
constructor() {
super();
}
show() {
this.display();
}
}
// 外部調用者
function renderMap(map) {
map.show(); // 統一接口調用
}
renderMap(new googleMap());
renderMap(new baiduMapAdapter());
複製代碼
適配器模式很是適用於跨瀏覽器兼容,例如強大的 jQuery 封裝了事件處理的適配器,解決跨瀏覽器兼容性問題,極大簡化咱們平常編程操做。github
// $('selector').on 的實現
function on(target, event, callback) {
if (target.addEventListener) {
// 標準事件監聽
target.addEventListener(event, callback);
} else if (target.attachEvent) {
// IE低版本事件監聽
target.attachEvent(event, callback)
} else {
// 低版本瀏覽器事件監聽
target[`on${event}`] = callback
}
}
複製代碼
適配器模式的初衷是爲了解決多對象(接口)兼容問題,若是存在多對象協同工做時,不方便直接修改原對象的基礎上,可考慮用適配器封裝,以便外部調用者統一使用。編程
適配器模式不會改變原有接口,這一點與裝飾者模式和代理模式相似。設計模式
適配器模式與代理模式最類似,一樣都是建立一個新對象(包裝一次),實現對本體的調用。瀏覽器
二者的區別:代理模式是爲了管控原有對象(本體)的訪問,代理的初衷並非爲兼容,並主張代理與本體對外接口保持一致。性能優化
而適配器則是爲兼容而生的 「轉換器」,並不預處理請求,直接將請求轉接給原接口,新接口與原接口名可能不一樣。性能
「代理模式「(嚴父):學校繳費要一千塊,這麼多? "適配器模式」 (慈母):學校繳費要一千塊,給給給。
裝飾者模式及外觀模式,會在以後的篇章整理,這裏稍做了解。
裝飾者模式的做用是爲對象添加功能,可添加屢次,造成裝飾鏈。而適配器只會對原有對象包裝一次。
外觀模式與適配器模式最大的區別,是定義了一個新的接口。
參考文章
本文首發Github,期待Star! github.com/ZengLingYon…
做者:以樂之名 本文原創,有不當的地方歡迎指出。轉載請指明出處。