設計模式——適配器模式

適配器模式將某個類的接口轉換成客戶端指望的另外一個接口表示,主的目的是兼容性,讓本來因接口不匹配不能一塊兒工做的兩個類能夠協同工做。其別名爲包裝器(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接口。

image

 

總結:

Adapter繼承自Adaptee和Target的類來完成適配。

Adapter持有Adaptee對象並實現Target接口來完成適配(java類是單繼承,最多隻能繼承一個類,對象適配器能夠繼承其它類)。

 

使用實例


1. Android中ListView經過ListAdapter加載每一條View,而不須要考慮各個view的不一樣

image

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

 

參考:

《大話設計模式》

http://www.javashuo.com/article/p-hjwllozo-q.html

https://www.jianshu.com/p/78f6083ef869

相關文章
相關標籤/搜索