“Head First 設計模式“ :適配器模式

適配器模式


適配器模式定義:將一個類的接口,轉化成客戶期望的另一個接口,適配器讓原本接口不兼容的類可以合作無間。對象適配器類圖如下:
“Head First 設計模式“ :適配器模式
角色說明
● Target,目標接口
● Adapter,適配器
● Adaptee,被適配對象
● Client,客戶端


客戶使用適配器的過程如下
● 客戶通過目標接口調用適配器的方法對適配器發出請求。
● 適配器使用被適配者接口把請求轉換成被適配者的一個或多個調用接口。
● 客戶接收到調用的結果,但並未察覺這一切是適配器在起轉換作用。


適配器模式的優點
● 將目標類和適配者類解耦,通過引入一個適配器類來重用現有的適配者類,無需修改原有結構。
● 增加了類的透明性和複用性,將具體的業務實現過程封裝在適配者類中,對於客戶端類而言是透明的,而且提高了適配者的複用性,同一適配者類可以在多個不同的系統中複用。
● 靈活性和擴展性都非常好,通過使用配置文件,可以很方便的更換適配器,也可以在不修改原有代碼的基礎上 增加新的適配器,完全複合開閉原則。


適配器模式的缺點
● 一次最多隻能適配一個適配者類,不能同時適配多個適配者。
● 目標抽象類只能爲接口,不能爲類,其使用有一定的侷限性。


適配器模式的使用場景
● 系統需要使用一些現有的類,而這些類的接口不符合系統的需要,甚至沒有這些類的源代碼
● 創建一個可以重複使用的類,用於和一些彼此之間沒有太大關聯的類,包括一些可能在將來引進的類一起工作


擴展
● 雙向適配器,兩個接口互相轉換,省略類圖,說明
● 類適配器,Java不支持多重繼承,所以省略類圖,說明


案例1:假設已有一個軟件系統,你希望它能和一個新的廠商類庫搭配使用,但是這個新的廠商所設計出來的接口不同於舊廠商的接口。怎麼實現好,如下:
“Head First 設計模式“ :適配器模式
解決辦法,我們不改目前代碼的情況下,加一個適配器(Adapter)類,適配器對用戶來說透明的,如下:

“Head First 設計模式“ :適配器模式


案例2:有鴨子接口(鴨子能飛,呱呱叫),火雞接口(可以飛點,姑姑叫),假設我們缺鴨子對象,用火雞來冒充,類圖如下:
“Head First 設計模式“ :適配器模式


案例3:JDK中早起版本的Collection集合都實現了一個elements(),該方法返回一個包含集合裏的每一個元素的枚舉,新版本的JDK裏用Iterator來代替了,而且Iterator還提供了刪除元素的能力,假設有一個預留代碼,這個代碼爆出枚舉接口,但是我們想新代碼中使用迭代器,我們用適配器模式來解決,如下:
“Head First 設計模式“ :適配器模式


案例4: JDK裏IO框架裏的InputStreamReader,OutputStreamReader使用的是適配器模式,如下:
“Head First 設計模式“ :適配器模式

說明:
● InputStream,OutputStream是被適配對象。
● Reader,Writer是目標接口。
● StreamEncoder是中間類,byte類型轉字符時需要編碼轉換的,貴類的作用就是這個。
● InputStreamReader,OutputStreamReader是適配器類。


設計原則:“最少知識”原則:只和你的密友談話。

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