1. 程式人生 > 實用技巧 >“Head First 設計模式“ :介面卡模式

“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是介面卡類。


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

轉載於:https://blog.51cto.com/u2r2otkit/2108145