設計模式——07 介面卡模式
07 Adapter Pattern(介面卡模式)
前言:通過將類的介面轉換成想要的介面,以便實現不用的介面。我們的程式可以用新的介面來封裝舊的介面,而客戶是無感知地呼叫新介面或者舊介面。
例子說明:
EXP1:港版的蘋果手機,用過港版的一定知道,港版手機的充電器是三角粗頭的,而大陸的插座則是細頭的,這樣需要使用港版的充電器的時候就需要有三轉二的轉介面,這裡的轉介面實際上就充當介面卡的作用。
港版充電頭 轉接頭 大陸插座
REQ1:現在有這麼種需求,我們在第一章節曾經寫過鴨子類吧,現在我們需要將火雞包裝成鴨子。
分析:先來看看類圖,說明火雞介面卡也繼承了介面Duck,而火雞介面卡中裝配了火雞,來實現具體的叫和飛的功能。
下面通過程式碼來實現這個部分,你會發現你將火雞變成了鴨子來用了。
火雞介面卡:
public class TurkeyAdatpter implements Duck { private Turkey turkey; public TurkeyAdatpter(Turkey turkey) { this.turkey = turkey; } public void quack() { turkey.gobble(); } public void fly() { for(int i=0; i<5; i++) { turkey.fly(); } } }
分析:介面卡模式非常地簡單,實際上就是介面卡來呼叫被適配者的功能。
1 客戶通過目標介面呼叫介面卡地方法對介面卡發出請求
2 介面卡使用被適配者介面把請求轉換成被適配者的一個或多個呼叫介面
3 客戶接收到呼叫的結果,但並未察覺這一切是介面卡在起轉換作用。
介面卡模式:將一個類的介面轉換成客戶期望的另一個介面,介面卡讓原本介面不相容的類可以合作無間。
這個模式可以通過建立介面卡進行介面轉換,讓不相容的介面變成相容。這可以讓客戶從實現的介面解耦。
下面是模式的一般類圖:
介面卡模式很好地運用了OO的設計原則,使用物件組合,以修改的介面包裝被適配者。
接下來,我們看看Java中的介面卡。早期Collection型別(Vector、Stack、Hashtable)都實現了elements方法,該方法返回一個Enumeration(列舉)。這個Enumeration介面可以遍歷集合中的每個元素。後來sun推出更新後的集合類後,開始使用迭代器(Iterator)介面,這個介面和列舉介面很類似,不同的是它還多個刪除元素的能力。
在EnumeratorIterator中要處理remove方法,介面卡無法實現一個實際功能remove方法,只能丟擲一個RuntimeException,Java的設計者也定義了UnsupportedException。
列舉介面卡:
public class EnumeratorIterator<E> implements Iterator<E> {
private Enumeration<E> enumer;
public boolean hasNext() {
return enumer.hasNext();
}
public E next() {
return enumer.next();
}
public E remove() {
throw new UnsupportedOperationException();
}
}
最後的最後,我們又來總結我們現在現有的設計模式武器。
面向物件基礎
抽象、封裝、多型、繼承
六大設計原則
設計原則一:封裝變化
設計原則二:針對介面程式設計,不針對實現程式設計。
設計原則三:多用組合,少用繼承。
設計原則四:為互動物件之間的鬆耦合設計而努力
設計原則五:對擴充套件開放,對修改關閉
設計原則六:依賴抽象,不要依賴於具體的類
模式
介面卡模式:將一個類的介面轉換成客戶期望的另一個介面,介面卡讓原本介面不相容的類可以合作無間。
最後獻上此次設計的原始碼,有需要的小夥伴可以下載來執行一下,首先先自己進行設計,然後再參考,這樣才能加深命令模式的理解。