常用設計模式:適配器模式
相信適配器這個概念對於大夥來說都不陌生了吧?曾經買過港貨的通過都知道,港貨當中的充電器插線頭是很蛋疼的三插口的,但是我們平常的充電插座,一般都是兩插口的,那麽要解決這個問題,我們的適配器就登場了,能夠完美的將三插口轉換成兩插口的接口,然後我們就能在我們的兩插口插排上使用充電器啦,姑且上個圖吧~(該篇隨記是參考了:http://blog.csdn.net/jason0539/article/details/22468457)
了解了什麽是適配器,那麽適配器模式就一目了然了,適配器模式就是將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以在一起工作。以下是適配器模式的具體的角色:
1.目標接口(Target):客戶所期待的接口。目標可以是具體的或抽象的類,也可以是接口。
2.需要適配的類(Adaptee):需要適配的類或適配者類。
3.適配器(Adapter):通過包裝一個需要適配的對象,把原接口轉換成目標接口。
二話不說,先上個代碼過過癮:
public interface Target { void twoInsert(); } //普通的實現了目標接口的類 public class ConcreteTarget implements Target { @Override public void twoInsert() { System.out.println("這個插頭有兩個插口"); } }
這是我們的目標接口和實現了目標接口的普通類。
//特殊的類,也就是我們例子當中的三插口的插頭 public class ThreeInsertSocket { public void ThreeInsert() { System.out.println("這個插頭有三個插口"); } }
這是我們的特殊類,接下來我們看看如何通過我們的適配器實現目標接口的twoInsert方法和ThreeInsert方法的適配,見證奇跡的時刻:
public class Adapter extendsThreeInsertSocket implements Target{ @Override public void twoInsert() { super.ThreeInsert(); } }
其實就是很簡單的辦法,首先通過適配器(adapter)去繼承ThreeInsertSocket,把特殊的方法繼承下來,然後再用適配器(adapter)去實現目標接口,通過重寫目標接口的方法,在該方法當中調用繼承下來的特殊方法即可,是不是很簡單?
public class test { public static void main(String[] args) { //正常實現了目標接口的普通功能類 Target concreteTarget = new ConcreteTarget(); concreteTarget.twoInsert(); // 使用特殊功能類,即適配類 Target adapter = new Adapter(); adapter.twoInsert(); } }
這個插頭有兩個插口
這個插頭有三個插口
這就是運行的結果。那麽總體過程可以總結為以下的圖:
圖中的Adaptee對應的就是我們的ThreeInsertSocket,這就是適配器模式當中的類適配器的寫法,類適配器是通過適配器類(adapter)繼承所需要適配的對象(adaptee),並且再實現目標接口(target)來實現被適配對象(adaptee)和目標接口(target)之間的耦合的。那麽除了這種方式,還有沒有其他方式來實現二者的耦合呢?當然有,那就是對象適配器模式。
一言不合,我們先看代碼:
public class Adapter implements Target { private ThreeInsertSocket adaptee; public Adapter(ThreeInsertSocket adaptee) { this.adaptee=adaptee; } @Override public void twoInsert() { adaptee.ThreeInsert(); } }
需要改動的就是我們的適配器類的代碼,可以看到,對象適配器模式當中,相比類適配器模式,不再對被適配對象(Adaptee)進行繼承,而是通過適配器類(adapter)的構造函數傳入被適配對象(Adaptee)的實例,然後通過委托該實例實現target接口當中定義的方法(twoInsert)
public class test { public static void main(String[] args) { //正常實現了目標接口的普通功能類 Target concreteTarget = new ConcreteTarget(); concreteTarget.twoInsert(); // 使用特殊功能類,即適配類 ThreeInsertSocket adaptee=new ThreeInsertSocket(); Target adapter = new Adapter(adaptee); adapter.twoInsert(); } }
這個插頭有兩個插口
這個插頭有三個插口
可以看出這時候各類和接口之間的關系圖應該變為:
那麽至此,我們的適配器模式也講解完畢,下一節,我們將開始我們的重頭戲,javaIO的學習~
常用設計模式:適配器模式