適配器模式(Adapter)
適配器模式把一一個類的接口變換成客戶端所期待的另一種接口,從而使原本接口不匹配而無法在一起工作的兩個類能夠在一起工作。
實際上就是對類或者對象,找到一個翻譯,能夠使得源對象能夠匹配到現對象。軟件系統設計和開發的問題
在軟件系統設計和開發中,這種問題也會經常遇到:
有時爲了完成某項工作購買了一個第三方的庫來加快開發。這就帶來了一個問題:我們在應用程序中已經設計好了接口,與這個第三方提供的接口不一致,爲了使得這些接口不兼容的類(不能在-起工作)可以在一起工作,Adapter模式提供了將一個類(第三方庫)的接口轉化爲客戶(購買使用者)希望接口的方法。
兩種形式
- 類的適配器模式
- 對象的適配器模式
適配器模式結構
從圖中可以看出:客戶端需要調用Request方法,而Adaptee沒有該方法,爲了使客戶端能夠使用Adaptee類,需要提供一個包裝(Wrapper) 類Adapter。這個包裝類包裝了一個Adaptee 的實例,從而將客戶端與Adaptee銜接起來。由於Adapter與Adaptee是委派(組合)關係,這決定了這個適配器模式是對象的。
- 目標(Target)角色這是客戶所期待的接口。目標可以是具體的或抽象的類也可以是接口。
- 源(Adaptee)角色需要適配的類
- 適配器(Adapter)角色通過在內部包裝(Wrap)一個Adaptee對象,把源接口轉換成目標接口。
實現要點
- Adapter模式主要應用於“希望複用一些現存的類,但是接口又與複用環境要求不一致的情況”,在遺留代碼複用、類庫遷移等方面非常有用。
- Adapter模式有對象適配器和類適配器兩種形式的實現結構
類適配器採用“多繼承”的實現方式帶來了不良的高耦合,所以一般不推薦使用。
對象適配器採用“對象組合”的方式,更符合松耦合精神。
使用情況
- 系統需要使用現有的類,而此類的接口不符合系統的需要。
- 想要建立一個有以重複使用的類,該類可能與其它不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協同工作。
- (對對象適配器而言)在設計裏,你想使用一些已經存在的子類,但是不可能對每一個子類都進行適配。對象適配器可以適配它們的父類接口(使用的擴展)。
優點
- 更好的複用性
- 更好的可擴展性
在實現適配器功能的時候,可以調用自己開發的功能,從而自然地擴展系統的功能
缺點
過多地使用適配器,會讓系統非常凌亂,不容易整體進行把握。
本質
轉換匹配,複用功能。
實現
用戶能看到的接口
package 適配器模式;
public class Target {
public void Reuqest()
{
System.out.println("一般請求");
}
}
需要適配的類
package 適配器模式;
public class Adaptee {
public void specifiRequest()
{
System.out.println("特殊請求");
}
}
適配器
package 適配器模式;
public class Adapter extends Target {
private Adaptee adp=new Adaptee();
@Override
public void Reuqest()
{
adp.specifiRequest();
}
}
客戶端
package 適配器模式;
public class Client {
public static void main(String[] args) {
Target target=new Adapter();
target.Reuqest();
}
}