適配模式與橋接模式的區別和聯絡
兩種模式的區別在於使用場合不同,適配器模式主要解決兩個已有介面間的匹配問題。這種情況下被適配的介面的實現往往是一個黑匣子。我們不想,也不能改變這個介面及其實現。同時也不能控制其演化,只要相關的對象能與系統定義的介面協同工作即可。適配器模式經常用在與第三方產品的功能整合上,採用該模式適應新類型的增加的方式是開發針對這個類的適配器。
圖1 採用適配器模式的擴充
橋接模式則不同,參與橋接的介面是穩定的,使用者可以擴充和修改橋接種的類,但是不能改變介面。橋接模式通過介面繼承或者類繼承實現功能的擴充。
按照GOF的說法,橋接模式和適配器模式用於設計的不同階段,橋接模式用於設計的前期,即在設計類的時候將雷規劃為邏輯和實現兩大類,使他們可以分別進行演化;而適配器模式用於設計完成之後,當發現完成的類無法協同工作時,可以採用適配器模式
然而,很多情況下載設計初期就要考慮適配器模式的使用,如涉及大量第三方應用介面的情況。
圖2 採用橋接模式的擴充
適配器模式與橋接模式的聯合
這種情況經常出現在需要其他系統提供實現方法時,一個典型的例子是工業控制中的資料擷取。不同工控廠家提供的底層資料擷取介面通常不同。,因此在做上層軟體設計師無法預知可能遇到的任何介面。為此需要定義一個通用的採集介面,然後針對據體的資料擷取系統開發相應的適配器。資料存放區需要調用資料擷取借口獲得資料,而火速據可以儲存到關聯式資料庫、實施資料庫或者檔案中。資料存放區介面和資料擷取結構構成了橋接。
圖3 橋接模式和適配器模式聯合
同樣的結構也經常出現在報表的相關應用中,報表本身結構和報表輸出完全可以分開。
圖4 資料擷取系統中的橋接模式與適配器模式
所以,報表輸出可以單獨抽象出來與報表的具體形式分開。但報表輸出又依賴於具體的輸出形式,如果需要輸出為PDF格式,則需要調用與PDF相關的API,而這是設計所無法控制的,因此這裡要使用適配器模式。
圖5 報表輸出系統中的橋接模式與適配器模式
適配器模式與面板模式的關係
適配器模式與面板模式有些相似,都是對現存系統的封裝。但這兩種模式的意圖完全不同。前者使現存系統與正在設計的系統協同工作,而後者則為現存系統提供一個更為方便的提供者。簡單的說,適配器模式為事後設計,而面板模式則必須事前設計。總之,適配器模式沒有引入新的介面,而面板模式則定義了一個新的介面。
圖6 系統演化過程中的面板模式