適配器模式:將一個類(對象)的接口(方法或屬性)轉化成客戶但願的另一個接口(方法或屬性),使得本來因爲接口不兼容而不能一塊兒工做的那些類(對象)能夠正常協做。簡單理解就是爲兼容而生的 「轉換器」。
對於強迫症患者,那麼多形狀各異的接口,對應着不一樣數據線。若是能夠有一個轉接口實現集合兼容,豈不美哉。沒錯,這樣一個適配器,你值得擁有。(各大廠商加把勁。。。)javascript
生活小栗子:html
實現方式:在不改變原有對象接口的基礎上,定義一個包裝對象,新對象轉接調用原有接口,使外部調用者能夠正常使用。
// 適配器實現地圖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 封裝了事件處理的適配器,解決跨瀏覽器兼容性問題,極大簡化咱們平常編程操做。java
// $('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 } }
適配器模式的初衷是爲了解決多對象(接口)兼容問題,若是存在多對象協同工做時,不方便直接修改原對象的基礎上,可考慮用適配器封裝,以便外部調用者統一使用。git
適配器模式不會改變原有接口,這一點與裝飾者模式和代理模式相似。github
適配器模式與代理模式最類似,一樣都是建立一個新對象(包裝一次),實現對本體的調用。編程
二者的區別:代理模式是爲了管控原有對象(本體)的訪問,代理的初衷並非爲兼容,並主張代理與本體對外接口保持一致。設計模式
而適配器則是爲兼容而生的 「轉換器」,並不預處理請求,直接將請求轉接給原接口,新接口與原接口名可能不一樣。瀏覽器
「代理模式「(嚴父):學校繳費要一千塊,這麼多?
"適配器模式」 (慈母):學校繳費要一千塊,給給給。
裝飾者模式及外觀模式,會在以後的篇章整理,這裏稍做了解。性能優化
裝飾者模式的做用是爲對象添加功能,可添加屢次,造成裝飾鏈。而適配器只會對原有對象包裝一次。性能
外觀模式與適配器模式最大的區別,是定義了一個新的接口。
參考文章
本文首發Github,期待Star!
https://github.com/ZengLingYong/blog
做者:以樂之名 本文原創,有不當的地方歡迎指出。轉載請指明出處。