適配器模式將某個類的接口轉換成客戶端指望的另外一個接口表示,主的目的是兼容性,讓本來因接口不匹配不能一塊兒工做的兩個類能夠協同工做。其別名爲包裝器(Wrapper)。html
簡單地說,就是須要的東西就在面前,但卻不能使用,而短期又沒法改造它,因而咱們就想辦法適配它。java
適配器分類:設計模式
注: 若是對類圖中的箭頭有疑惑參考: UML類圖中的六種關係(物理設計階段)數組
1. 類適配器模式app
在Adapter中實現目標接口同時繼承待適配類來完成適配:測試
Target 爲目標接口類this
Adaptee 爲待適配類spa
Adapter 適配器類: 將Adaptee適配爲Target接口.net
// 已存在的、具備特殊功能,但不符合咱們既有的標準接口的類 class Adaptee { public void specificRequest() { System.out.println("被適配的類,該類具備特殊功能"); } } // 目標接口 interface Target { public void request(); } // 具體目標類,只提供普通功能 class ConcreteTarget implements Target { public void request() { System.out.println("普通類,該類具備普通功能"); } } // 適配器類,繼承了被適配類,同時實現標準接口 class Adapter extends Adaptee implements Target{ public void request() { super.specificRequest(); } } //測試類 // 使用普通功能類 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); //輸出「普通類,該類具備普通功能」 // 使用特殊功能類,即適配類 Target adapter = new Adapter(); adapter.request(); //輸出「被適配的類,該類具備特殊功能」
2. 對象的適配器模式設計
與類適配器不一樣的是,對象適配器持有Adaptee對象而不須要繼承它。
//只須要修改適配器類便可 //適配器類,只實現標準接口 class Adapter implements Target{ private Adaptee adaptee; public Adapter (Adaptee adaptee) { this.adaptee = adaptee; } public void request() { this.adaptee.specificRequest(); } } //測試類 Target concreteTarget = new ConcreteTarget(); concreteTarget.request(); //輸出「普通類,該類具備普通功能」 //Adapter須要先建立一個被適配類的對象做爲參數 Target adapter = new Adapter(new Adaptee()); adapter.request(); //輸出「被適配的類,該類具備特殊功能」 --------------------- 做者:SEU_Calvin 來源:CSDN 原文:https://blog.csdn.net/SEU_Calvin/article/details/71126649 版權聲明:本文爲博主原創文章,轉載請附上博文連接!
3. 接口的適配器模式
大話設計模式中沒有 接口適配模式,可是不少網上文章中仍是提到了接口適配,因此這裏也講解一下:
目的:減小接口實現,Adaptee類只須要實現接口中的一部分
Wrapper:至關於適配器(這裏的做用和抽象類功能相同)
Adaptee: 待適配的類,只實現了request接口而不須要實現cancel接口。
總結:
Adapter繼承自Adaptee和Target的類來完成適配。
Adapter持有Adaptee對象並實現Target接口來完成適配(java類是單繼承,最多隻能繼承一個類,對象適配器能夠繼承其它類)。
使用實例
1. Android中ListView經過ListAdapter加載每一條View,而不須要考慮各個view的不一樣
ListView 是client
ListAdapter 是 Target
BaseAdapter/ArrayAdapter/CursorAdapter 是 適配類
List<T>/Cursor 中保存了列表數據,須要適配成多個view展現到ListView上,它至關於 Adaptee
因此這裏使用了: 類適配模式 + 接口適配模式
2.jdk中InputStreamReader/OutputStreamWriter
Reader/Writer : 至關於 Target
InputStreamReader 是 Adapter
InputStrea 是 Adaptee
因此這裏使用了: 對象適配模式
3. jdk中Arrays.asList(T …a)
將 數組適配成List對象,這裏好像和上面講的三種模式都不像,它經過一個接口將一種對象類型數據轉換爲另外一種類型數據:
輸出類型List 做爲 Target
asList接口 做爲 Adapter
輸入數組 a 是 Adaptee
參考:
《大話設計模式》