設計模式——適配器模式

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

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

 

參考:

《大話設計模式》

https://blog.csdn.net/SEU_Calvin/article/details/71126649

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章