一、適配器模式 1、概念 定義:將一個類的介面,轉換成客戶期望的另一個類的介面,適配器讓原本介面不相容的類可以合作無間。 安卓轉Type C頭,就是一個典型的適配器模式。在安卓頭和 Type C 之間引入適配器,安卓頭是被適配者。 解析: 1、 客戶(Client)通過目標接 ...
一、適配器模式
1、概念
- 定義:將一個類的介面,轉換成客戶期望的另一個類的介面,適配器讓原本介面不相容的類可以合作無間。
- 安卓轉Type-C頭,就是一個典型的適配器模式。在安卓頭和 Type-C 之間引入適配器,安卓頭是被適配者。
- 解析:
1、 客戶(Client)通過目標介面(Target Interface)調用適配器(Adapter)的方法對適配器發出請求。
2、 適配器使用被適配器介面(Adaptee Interface)把請求轉換成被適配者的一個或多個調用介面。
3、 客戶接收到調用的結果,但並未察覺這一切是適配器在起轉換作用。
- 結構:適配器有兩種,分別是類適配器和對象適配器。類適配器採用多重繼承實現,在 Java 中不適用;對象適配器採用繼承和組合實現。以下是兩種結構的類圖:
2、Demo 實現
在 JDK1.0 時我們用的集合還是 Vector(後來推薦使用 ArrayList),我們用的迭代器還是 Enumeration(後來推薦使用 Iterator)。現在我們想寫一個適配器,讓 Vector 也能使用 Iterator 迭代器,即在 Enumeration 和 Iterator 之間做適配。
/**
* 1、Iterator 是目標(Target)介面角色。
* 2、Enumeration 是被適配者(Apaptee)角色。
* 3、EnumerationAdapter 是適配者(Adapter)角色。
*/
public class EnumerationAdapter implements Iterator {
private Enumeration enumeration;
public EnumerationAdapter(Enumeration enumeration) {
this.enumeration = enumeration;
}
@Override
public boolean hasNext() {
return enumeration.hasMoreElements();
}
@Override
public Object next() {
return enumeration.nextElement();
}
@Override
public void remove() {
throw new UnsupportedOperationException("remove");
}
}
public static void main(String[] args) {
Vector vector = new Vector();
vector.add("java");
vector.add("python");
vector.add("javaScript");
Enumeration enumeration = vector.elements();
Iterator iterator = new EnumerationAdapter(enumeration);
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
3、總結
- 應用場景:系統需要使用一些現有的類,而這些類的介面不符合系統的需要,甚至沒有這些類的源代碼。
- 優點:
1、將介面轉化成客戶真正能接受的介面,為不用的介面之間做適配。
2、客戶和被適配者之間是解耦的。倘若一段時間之後,我們想要改變介面,適配器可以將改變的部分封裝起來,而客戶不用做任何的改變。另外,被適配者的任何子類,都可以搭配著適配器使用。
- 缺點:
1、一次最多只能適配一個適配者類,不能同時適配多個適配者。
2、目標抽象類只能為介面,不能為類,其使用有一定的局限性。
二、外觀模式
- 外觀(Facade)模式:提供了一個統一的介面,用來訪問子系統中的一群介面。外觀定義了一個高層介面,讓子系統更容易使用。
- 外觀模式說是設計模式中最簡單的模式也不為過,因為它沒有那麼多複雜的角色,它的工作只有一個 —— 簡化介面。它可能持有一個或者數個類對象的組合,然後將它們複雜的一切(實現、執行順序等)隱藏在身後,只露出一個乾凈美好的外觀。
- 外觀模式不只是簡化了介面,也將客戶從組件的子系統中解耦。
- 外觀模式提供簡化介面的同時,依然將系統完整的功能暴露出來,以供需要的人使用。