一、適配器模式
1. 定義
適配器模式,將一個類的接口轉換成客戶希望的另外一個接口。適配器模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。(引自《大話設計模式》)
2. 說明
這有點類似生活中用到的電源變壓器,可以把電源變成我們所需要的電壓。再舉個例子,比如我們到國外,聽不懂外國人說話,我們需要一個翻譯,這個翻譯就起到了一個適配器的功能,將我們聽不懂的外國語轉換成我們可以聽懂的漢語。
適配器模式包括兩種類型:
- 類適配器模式:採用繼承的方式實現。
- 對象適配器模式:採用對象組合的方式實現。
3. 類適配器模式
3.1 類圖
3.2 說明
Target:目標類,可以是接口或抽象類,由於此模式中Adapter還需要繼承Adaptee,所以此處Target採用接口方式。Target中包含request()方法,爲客戶所期待的接口,是客戶可以調用的。
ConcreteTarget:目標實現類,實現了普通接口請求的方法。
Adaptee:需要適配的類,包含特殊接口請求,特殊接口請求客戶不能直接調用。
Adapter:適配器,是適配器模式的核心,將特殊接口轉換成客戶可以調用的普通接口請求。
3.3 代碼實現
Target
public interface Target {
//客戶所期待的接口
public void request();
}
ConcreteTarget
public class ConcreteTarget implements Target{
@Override
public void request() {
System.out.println("普通接口請求!!");
}
}
Adaptee
public class Adaptee {
//特殊接口,客戶不能調用
public void specificRequest() {
System.out.println("特殊接口請求!!");
}
Adapter
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
super.specificRequest();
}
}
測試類
public class AdapterTest {
public static void main(String[] args) {
//調用普通接口請求
Target target = new ConcreteTarget();
target.request();
//調用特殊接口請求
Target adapter = new Adapter();
adapter.request();
}
}
結果
4. 對象適配器模式
4.1 類圖
4.2 說明
這裏和類適配器模式基本相同,唯一不同的地方是,Adapter不再繼承Adaptee類,而是在Adapter中維護了一個Adaptee對象,可以在實例化Adapter時傳入,這樣和類適配器模式相比有一個好處,在Adapter中可以維護多個Adaptee對象,畢竟在java中是不可以多繼承的。
4.3 代碼實現
只有Adapter類不同於類適配器模式,所以其他類的代碼就不重複列出了。
Adapter
public class Adapter implements Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
測試類
public class AdapterTest {
public static void main(String[] args) {
//調用普通接口請求
Target target = new ConcreteTarget();
target.request();
//調用特殊接口請求
Target adapter = new Adapter(new Adaptee());
adapter.request();
}
}
結果,與上面一致
在這裏的Adapter中,首先要引入被適配對象Adaptee,然後才能把特殊功能委派給適配器Adapter去完成。Adapter和Adaptee其實算是一種委派關係。在這個類中維護了Adaptee對象,也可以維護多個Adaptee對象,這相對類適配器模式就靈活了許多。
5. 總結
- 當想使用已經存在類的方法,但方法不符合我的要求時,可以考慮使用適配器模式。
- 兩個或多個類所做的事情相同或相似時,但是具有不同的接口時要使用它,可以考慮使用適配器模式。
- 在被調用和調用雙方都不容易修改時,可以考慮使用適配器模式。
- 在我看來,Adapter和Decorator有點類似,都可以對接口進行一定的包裝,在調用前後增減一些功能。
- 適配器模式只是適用軟件開發的後期或者維護階段,只是爲不可調配的雙方提供了一種“亡羊補牢”的方式,在軟件構建的初期,我們還是應該儘量設計好,避免出現此種情況。
寫在最後,
本文主要是小貓看了《大話設計模式》的一些記錄筆記,再加之自己的一些理解整理出此文,方便以後查閱,僅供參考。
適配器模式比較簡單,用到的不是特別多,這裏沒有額外舉例子進行說明,等之後有時間再進行補充。