適配器模式將某個類的接口轉換成客戶端期望的另一個接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個類可以協同工作。其別名爲包裝器(Wrapper)。
簡單地說,就是需要的東西就在面前,但卻不能使用,而短時間又無法改造它,於是我們就想辦法適配它。
適配器分類:
- 類適配器模式
- 對象的適配器模式
- 接口的適配器模式
注: 如果對類圖中的箭頭有疑惑參考: UML類圖中的六種關係(物理設計階段)
1. 類適配器模式
在Adapter中實現目標接口同時繼承待適配類來完成適配:
Target 爲目標接口類
Adaptee 爲待適配類
Adapter 適配器類: 將Adaptee適配爲Target接口
// 已存在的、具有特殊功能,但不符合我們既有的標準接口的類 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
參考:
《大話設計模式》