您好,登錄后才能下訂單哦!
適配器模式定義:將一個類的接口,轉化成客戶期望的另一個接口,適配器讓原本接口不兼容的類可以合作無間。對象適配器類圖如下:
角色說明:
● Target,目標接口
● Adapter,適配器
● Adaptee,被適配對象
● Client,客戶端
客戶使用適配器的過程如下:
● 客戶通過目標接口調用適配器的方法對適配器發出請求。
● 適配器使用被適配者接口把請求轉換成被適配者的一個或多個調用接口。
● 客戶接收到調用的結果,但并未察覺這一切是適配器在起轉換作用。
適配器模式的優點:
● 將目標類和適配者類解耦,通過引入一個適配器類來重用現有的適配者類,無需修改原有結構。
● 增加了類的透明性和復用性,將具體的業務實現過程封裝在適配者類中,對于客戶端類而言是透明的,而且提高了適配者的復用性,同一適配者類可以在多個不同的系統中復用。
● 靈活性和擴展性都非常好,通過使用配置文件,可以很方便的更換適配器,也可以在不修改原有代碼的基礎上 增加新的適配器,完全復合開閉原則。
適配器模式的缺點:
● 一次最多只能適配一個適配者類,不能同時適配多個適配者。
● 目標抽象類只能為接口,不能為類,其使用有一定的局限性。
適配器模式的使用場景:
● 系統需要使用一些現有的類,而這些類的接口不符合系統的需要,甚至沒有這些類的源代碼
● 創建一個可以重復使用的類,用于和一些彼此之間沒有太大關聯的類,包括一些可能在將來引進的類一起工作
擴展:
● 雙向適配器,兩個接口互相轉換,省略類圖,說明
● 類適配器,Java不支持多重繼承,所以省略類圖,說明
案例1:假設已有一個軟件系統,你希望它能和一個新的廠商類庫搭配使用,但是這個新的廠商所設計出來的接口不同于舊廠商的接口。怎么實現好,如下:
解決辦法,我們不改目前代碼的情況下,加一個適配器(Adapter)類,適配器對用戶來說透明的,如下:
案例2:有鴨子接口(鴨子能飛,呱呱叫),火雞接口(可以飛點,姑姑叫),假設我們缺鴨子對象,用火雞來冒充,類圖如下:
案例3:JDK中早起版本的Collection集合都實現了一個elements(),該方法返回一個包含集合里的每一個元素的枚舉,新版本的JDK里用Iterator來代替了,而且Iterator還提供了刪除元素的能力,假設有一個預留代碼,這個代碼爆出枚舉接口,但是我們想新代碼中使用迭代器,我們用適配器模式來解決,如下:
案例4: JDK里IO框架里的InputStreamReader,OutputStreamReader使用的是適配器模式,如下:
說明:
● InputStream,OutputStream是被適配對象。
● Reader,Writer是目標接口。
● StreamEncoder是中間類,byte類型轉字符時需要編碼轉換的,貴類的作用就是這個。
● InputStreamReader,OutputStreamReader是適配器類。
設計原則:“最少知識”原則:只和你的密友談話。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。