適配器與組合模式

適配器

定義

        將一個類的接口轉換成客戶希望的另外一個接口,適配器模式使原本由於接口不兼容而不能一起工作的類可以一起工作。

關鍵詞

        轉換、兼容——轉換接口,使不能兼容的接口可以兼容。

        適配——連接兩個都無法更新的系統,使其能協同工作。

調用時機

        一般在某個系統設計完成之後,爲了兼容、使用該系統中某些功能而採用適配器模式。在設計之初,最好不要使用適配器模式。

分類

        類適配器與對象適配器。

        類適配器:繼承或實現多個接口,使該類可以在不同的系統中使用。如系統A有接口IA,系統B有接口IB,定義類Adapter即實現IA又實現IB,則Adapter可以用在A、B中。當然Adapter也可以繼承A中的某個實現了IA接口的類。

        其優點在於可以修改繼承的類的某個方法,提供定製的功能。

        其缺點在於如果需要對IA的多個子類進行適配,將非常麻煩。因爲一個子類將對應一個適配類。並且JAVA不支持多繼承,會限制一些對類適配器的使用。

        對象適配器:繼承或實現客戶需要的接口,並將已有類當作一個變量植入適配器類中。其優缺點與類適配器完全相反。如A中需要IA類型的對象,而B中已有對象BP。建立一個BAdapter實現IA接口,同時持有BP的引用,在IA接口中使用BP輔助完成相應的一些功能。

        對象適配器類似於橋接模式,但兩者的出發點完全不同:適配器模式是爲了兼容舊有的系統與新系統,而橋接模式則是爲了使抽象與實現可以獨立地變化。並且,前者一般在設計完成之後才使用,而後者在設計之初就使用

組合模式

定義

        將對象組成樹形結構以表示“部分-整體”的層次結構,組合模式使外界對單一對象與組合對象的使用具有一致性。

關鍵詞

        一致性——外界對單個對象與組合對象的使用具有一致性,即不必分明白當前使用的是單個對象還是組合對象。

使用場景

        1,忽略組合對象與單個對象的不同時。

常見問題

對單個對象的抽象操作應該定義在哪?

        組合對象中必然有對單個對象的操作,如Add,Remove等,這些操作應該定義在哪?如果定義在基類中則單個組件還有這些操作,增加了安全性問題;如果將這些操作只定義在組合組件中,那麼用戶在某些時候必須要強轉成組合組件的基類才能使用這些操作,對透明性有一定的影響。

        因此,這個問題就是衡量安全性與透明性。

單個組件的集合定義在哪?

        聲明在基類中,則單個組件也具有集合變量,會造成內存的浪費。但如果單個組件比較少,則可以聲明在基類中。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章