十九、介面卡設計模式
阿新 • • 發佈:2019-01-01
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的實現。