介面卡模式:揭祕措不及防需求變化的補救措施
目錄
概述與模型
1、概述
含義:將一個類的介面,轉換成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間。
說明:這是一種補救措施,在最開始設計的時候不建議使用這種設計模式。
分類:類介面卡、物件介面卡。類介面卡就是採用繼承的方式,物件介面卡採用組合的方式,源於Java裡面只支援單繼承,所以此處只實現物件介面卡。
2、模型
應用場景描述
場景描述:假設我需要在我的膝上型電腦上接入鍵盤,我這個鍵盤比較奇葩,不是USB介面的,是圓孔的。而且,我們這裡還沒有USB的賣,而且現在10000個程式設計師需要鍵盤,這種突發狀況也很少見啊,很可能成為常態,我們又不可能去改變原來的設計結構,我們該怎麼辦?使用者需求(使用鍵盤,我才不管怎麼解決呢?)-->呼叫Adapter(轉換器)-->Adaptee(圓孔線鍵盤)。而正常情況下是,使用者需求(使用鍵盤)-->Adaptee(USB介面鍵盤)。我們來看實現。
介面卡模式實現
1、目標物件
public interface Target {
public void request();
}
2、介面卡
public class Adapter implements Target { private Adaptee adaptee; public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } public void request() { System.out.println("新增一個介面卡給adaptee"); adaptee.specialRequest(); } }
3、被適配者
public class Adaptee {
public void specialRequest(){
System.out.println("接入鍵盤!");
}
}
4、客戶端測試
public class Client { public static void main(String [] args){ //流程:程式設計師-->使用(request)-->介面卡(Adapter)-->鍵盤(Adaptee) Target coder=new Adapter(new Adaptee()); //我要使用鍵盤 coder.request(); } }
5、測試結果
再進一步
1、介面卡模式是什麼?介面卡模式有什麼用?
將一個類的介面,轉換成客戶需要的介面。也就是說,使用者只關心介面(Target),並不關心你內部的實現,而當有特殊需求的時候,我們只需要不斷的新增介面卡就行,並不用關心其他的。
這是一種補救措施,最初設計不夠完善的解決方案。
2、真實世界的介面卡
IO中:InputStream-->FileInputstream-->File:最初IO肯定就是隻是處理流,而不處理其他的。而隨著變化,現在需求是,我要讀取二進位制流(二進位制檔案)。那麼InputStream無法改變,使用者需求無法改變,我們只能新增介面卡來解決,從而就演變出FileInputStream、DataInputStream來充當介面卡角色,可能以後還會出現各種處理流物件的介面卡待你去解決呢。關於IO的整體處理細節參考我的裝飾者模式:http://www.cnblogs.com/qiuyong/p/6538856.html
InputStream-Target is=new FileInputStream-Adapter (new File()-Adaptee);
is.read();
通過上述描述你可能已經知道介面卡模式的作用了,不妨自己也造一個關於介面卡模式的運用場景?
比如,迭代器(Target)-->列舉類介面卡-->處理hasNext()、...
public class EnumrationIterator implements Iterator{
Enumeration enumeration;
public EnumrationIterator(Enumeration enumeration) {
this.enumeration=enumeration;
}
public boolean hasNext() {
return (boolean)enumeration.hasMoreElements();
}
public Object next() {
return enumeration.nextElement();
}
public void remove() {
throw new UnsupportedOperationException();
}
}