《JavaScript設計模式與開發實踐》模式篇(14)—— 介面卡模式

weixin_34148340發表於2018-12-26

介面卡模式的作用是解決兩個軟體實體間的介面不相容的問題。使用介面卡模式之後,原本 由於介面不相容而不能工作的兩個軟體實體可以一起工作。 介面卡的別名是包裝器(wrapper),這是一個相對簡單的模式。在程式開發中有許多這樣的 場景:當我們試圖呼叫模組或者物件的某個介面時,卻發現這個介面的格式並不符合目前的需求。 這時候有兩種解決辦法,第一種是修改原來的介面實現,但如果原來的模組很複雜,或者我們拿 到的模組是一段別人編寫的經過壓縮的程式碼,修改原介面就顯得不太現實了。第二種辦法是建立 一個介面卡,將原介面轉換為客戶希望的另一個介面,客戶只需要和介面卡打交道。

故事背景

現在使用谷歌地圖和百度地圖在頁面展現地圖

var googleMap = { 
    show: function(){
        console.log( '開始渲染谷歌地圖' ); 
    }
};
var baiduMap = { 
    show: function(){
        console.log( '開始渲染百度地圖' ); 
    }
};
var renderMap = function( map ){
    if ( map.show instanceof Function ){
        map.show(); 
    }
};
renderMap( googleMap ); // 輸出:開始渲染谷歌地圖
renderMap( baiduMap ); // 輸出:開始渲染百度地圖
複製程式碼

問題假設

這段程式得以順利執行的關鍵是 googleMap 和 baiduMap 提供了一致的 show 方法,但第三方的 介面方法並不在我們自己的控制範圍之內,假如 baiduMap 提供的顯示地圖的方法不叫 show 而叫 display 呢

baiduMap 這個物件來源於第三方,正常情況下我們都不應該去改動它。此時我們可以通過增 加 baiduMapAdapter 來解決問題

var googleMap = { 
    show: function(){
        console.log( '開始渲染谷歌地圖' ); 
    }
};
var baiduMap = {
    display: function(){
        console.log( '開始渲染百度地圖' ); 
    }
};
var baiduMapAdapter = { 
    show: function(){
        return baiduMap.display();
    } 
};
renderMap( googleMap ); // 輸出:開始渲染谷歌地圖
renderMap( baiduMapAdapter ); // 輸出:開始渲染百度地圖
複製程式碼

總結

  • 介面卡模式主要用來解決兩個已有介面之間不匹配的問題,它不考慮這些介面是怎樣實 現的,也不考慮它們將來可能會如何演化。介面卡模式不需要改變已有的介面,就能夠 使它們協同作用。
  • 裝飾者模式和代理模式也不會改變原有物件的介面,但裝飾者模式的作用是為了給物件 增加功能。裝飾者模式常常形成一條長的裝飾鏈,而介面卡模式通常只包裝一次。代理 模式是為了控制對物件的訪問,通常也只包裝一次。
  • 外觀模式的作用倒是和介面卡比較相似,有人把外觀模式看成一組物件的介面卡,但外 觀模式最顯著的特點是定義了一個新的介面。

系列文章:

《JavaScript設計模式與開發實踐》最全知識點彙總大全

相關文章