在日常生活中,我們時常會遇到一些相容性的問題,比如我的筆記本的電源插頭就是歐標的,在很多場合我都沒法用,買一個可以用的插座當然是可選手段,但到那裡去都拿這麼大個傢伙一是不方便,二也未必有地方可以插,所以我只好買個電源適配插座帶在身上。再比如電腦的輸入電壓一般都只有20伏左右,而日常電源基本都是220伏,所以就需要一個電來源配接器,來降低電壓。這些都是為瞭解決不同標準之間的相容性問題。設計模式中的適配器模式就是我們在設計中用來解決標準相容性問題的一種重要手段。適配器的角色分為適配器,適配對象和適配目標。適配對象是具體功能的執行者,但因介面原因使用者無法直接調用,適配目標是使用者希望的調用介面,適配器就繼承適配目標,實現目標介面,介面的具體執行由保持的適配對象來執行。
適配器的應用情境:
1)需要使用一個已經存在的類,但這個類的介面標準不符合你的要求。分兩種情況,一是老的系統中的類,但又不能修改這個類的介面(有的系統還需要使用,或者沒有原始碼),而現在又定義了新的標準。這在系統升級過程中很常見,二是該類屬於第三方的類,可能你不想修改,或者也沒法修改。這兩種情況都要求你定義一個適配器類來解決這種不同標準時間的相容問題;
2)需要定義一個能夠被複用的類,而這個類能夠與其它不相關的類或者不可預見的類一起協同工作,一個實現多個介面的類的目的往往就如此;
適配器的分類:
1)類適配器:適配器既實現目標介面,又適配對象繼承。適配器在目標介面的實現中調用原對象的介面,達到介面轉接的目的。但注意在類適配器模式中,目標介面只能用介面表示,不能採用類表示,因為這樣會造成多繼承出現。類適配器的好處是為適配對象增加部分功能比較容易(適配器作為適配對象子類,可以很方便的實現適配對象的訪問)
2)對象適配器:適配器實現目標介面,但不從適配對象繼承,而是維護一個對適配對象的引用,這樣做的好處是在需要使用一些已經存在的子類,但是不可能對每個類都進行子類化以匹配它們的介面的時候,對象適配器可以通過適配
它們的父類介面來實現對一系列子類的介面匹配,這也是類適配器不能做到的地方。但對象適配器也有缺點,因為是維護對適配對象的引用,而不是繼承,因此在需要為適配對象增加功能時變得比較困難。
對象適配器一般比較簡潔,而類適配器則比較臃腫,因為大多時候採用適配器的地方,並不需要知道適配對象的很多細節,需要適配的介面都比較單一,這個時候採用對象適配器會比較好。類適配器不僅適配了介面,同時也繼承了適配對象的很多其它功能,而且很容易暴露適配對象的細節。
與其它模式的關係:
1)與裝飾模式相比,適配器模式是為了適配對象的介面,而裝飾模式是為了增強對象的功能。裝飾模式可以實現遞迴調用,而適配器模式則不能(對象適配器如果適配器是抽象的則可以,但一般不這麼做,如果需要可以採用其它模式實現)。
2)橋模式和對象適配器有類似結構,但目的不一樣,橋模式是為了介面與實現分隔開來以便利改變並使其不相關(抽象部分和實現部分各自獨立變化),而對象型適配器的目的則是改變現有對象的介面。
3)代理模式的目的是為對象增加一個控制訪問的中間代理,但它並不改變對象的介面,而適配器模式則是為了改變對象的介面,以適應新的介面標準,而不是為了增加附加性的功能(雖然也可以)。
另外,裝飾模式,代理模式,適配器模式的作用比較相近,都是為了改變或增加對象的功能或者介面,而組合模式則是為了一致對待對象,同時提供了一種對象的組織方式。嚴格的將,在幾個結構型模式中只有組合模式是完全意義上的結構模式。
後記:適配器的模式的關鍵在於介面適配。在新的系統設計開發中這種模式一般比較少用,而在系統重構或者已有系統維護中會使用一些。當然在新的系統中使用適配器也會存在,主要用於一些相似功能跨平台或多系統支援,比如silverlight的跨平台底層適配器層等。