1. 程式人生 > >十九、介面卡設計模式

十九、介面卡設計模式

1. 介面卡模式介紹

我們在日常生活中,會經常接觸到設配器模式,比如我們的充電器,不同的手機介面型別可能不一樣,這個時候只要一個轉介面,就可以解決我們的問題。這個轉介面就是我們的介面卡。

定義

介面卡模式把一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起的兩個類能夠在一起工作。

2. 介面卡模式的使用場景

  • 系統需要使用現有的類,而此類的介面不符合系統的需要,即介面不相容。
  • 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作。
  • 需要一個統一的輸出介面,而輸入端的型別不可預知。

3. 介面卡模式的UML類圖

類介面卡模式UML:

類介面卡模式

物件介面卡模式UML:

物件介面卡模式

4. 介面卡模式的簡單例項

類介面卡模式

  • (1)、目標介面Target
public interface Target {

    /**
     * 源Adaptee中有的方法
     */
    public void operation1();

    public void operation2();
}

目標介面中有兩個方法,operation1()是源Adaptee中有的方法,operation2()是沒有的方法。

  • (2)、Adaptee角色:
public class Adaptee {

    public
void operation1() { System.out.println("operation1"); } }

Adaptee角色中只有一個和介面中名稱一樣的方法operation1()。

  • (3)、Adapter角色:
public class Adapter extends Adaptee implements Target {
    @Override
    public void operation2() {
        //相關程式碼
        System.out.println("operation2");
    }
}

在Adapter角色中,繼承了Adaptee類,同時實現了Target介面,這樣Adaptee中有了兩個方法。

  • (4)、測試類:
public class Client {
    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.operation1();
        adapter.operation2();
}

物件介面卡模式

物件適配模式和類適配模式的區別在於Adapter類中,物件適配模式的Adapter類如下:

public class Adapter {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void operation1(){
        this.adaptee.operation1();
    }

    public void operation2(){

    }
}

在Adapter的構造方法中,傳遞進來一個Adaptee物件引用,Adapter類中有介面的兩個方法,operation1()直接呼叫adaptee中的operation1()方法;operation2()實現具體的邏輯即可。

選擇那種方法?

在Adapter的使用過程中,儘量使用物件介面卡的實現方式,多用合成或者聚合,少用繼承。因為類只能繼承一次,具有侷限性。

5. 介面卡模式在Android原始碼中

我們在開發中都使用過ListView,使ListView填充起來的就是Adapter,Adapter的作用就是將不同的Item填充到不同的View中。這裡的Adaptee就是需要被處理的item View,Target角色就是View。

6. 總結

  • 優點:

    • 更好的複用性。系統需要使用現有的類,而此類的介面不符合系統的需要。那麼通過介面卡模式就可以讓這些功能得到更好的複用。

    • 更好的擴充套件性。在實現介面卡功能的時候,可以呼叫自己開發的功能,從而自然地擴充套件系統的功能。

  • 缺點:

    • 過多的使用介面卡,會讓系統非常零亂,不易整體進行把握。比如呼叫的是A介面,卻呼叫的是B的實現。