GOF設計模式——Adapter模式
一、什麽是Adapter模式?
Adapter模式,又稱為適配器模式。
這是一個很通俗的名字,“適配器”,我們可以聯想到筆記本電腦的充電器(專業名稱又叫適配器),每一臺筆記本電腦會對應只有一個適配器,適配器的作用是對民用的電壓和電流進行轉換,使得電壓和電流滿足當前的筆記本電腦的實際需求。那麽,到了程序裏面,又是怎麽理解呢?我們可以將筆記本電腦實際的電壓和電流當作是程序的需求,民用電壓當作是程序原有情況,那麽Adapter模式下的類就是充當這個充電器(適配器)。
二、Adapter模式的分類:
1、Class Adapter模式(使用繼承)
所謂的Class Adapter模式就是使用繼承的方式實現,就是當Target(需求)是一個接口時,就可以使用繼承的方式。
2、Object Adapter模式(使用委托)
Object Adapter模式使用委托的方式,就是將具體實現交給別的對象執行。註意,這裏的Tager(需求)已經是一個類,而不是一個接口,由於java只支持單繼承的原則,所以對於Adaptee(實際情況),只能通過委托的方式交給Adapter調用。在Adapter類裏面多了一個屬性adaptee,這是Adaptee類的對象,通過這個對象來調用Adaptee裏面的方法。
三、具體使用
1、Class Adapter模式
Main類:充當Client角色,用於使用Print的相關方法(即我要給筆記本電腦充電);
Print接口:充當Target角色,就是實際需求(即當前筆記本電腦只需要12V直流電壓);
Banner類:充當Adaptee角色,就是實際情況(即當前只有民用220V交流電壓);
PrintBanner類:充當Adapter角色,就是適配器類(即筆記本電腦充電適配器)。
- Print接口
public interface Print{
public abstract void printWerk();//打印削弱
public abstract void printStrong();//打印增強
}
- Banner類
public class Banner{
private String string;
public Banner(String string){
this.string = string;
}
public void showWithParen(){
System.out.println("(" + string + ")");
}
public void showWithAster(){
System.out.println("*" + string + "*");
}
}
- PrintBanner類
public class PrintBanner extends Banner implements Print{
public PrintBanner(String string){
super(string);
}
public void printWeak(){
showWithParen();
}
public void printStrong(){
showWithAster();
}
}
- Main類
public class Main{
public static void main(String[] args){
Print p = new PrintBanner("hello world");
p.printWeak();
p.printStrong();
}
}
2、Object Adapter模式
上圖的類的角色跟ClassAdapter模式的類的角色一樣。
public abstract class Print{
public abstract void printWeak();
public abstract void printStrong();
}
- PringtManager
public class PrintBanner extends Print{
private Banner banner;
public PrintBanner(String string){
this.banner = new Banner(string);
}
public void printWeak(){
banner.showWithParen();
}
public void printStrong(){
banner.showWithAster();
}
}
Banner類和Main類跟Class Adapter模式的一樣,這裏不重復。
定位到main方法,上面兩種模式的使用中,在main方法裏都沒有直接使用到Banner類的方法,也就是我需要給筆記本電腦充電(Print中的兩個抽象方法),我根本不關心民用電壓多少(Banner類的方法),只要使用這個特制的適配器(PrintBanner類),就可以滿足我充電的這個動作需求。
四、Adapter模式應用場景
很多時候,我們並不是從零開始編寫項目的,即這個項目已經設計了很多個類,或者經常使用已有的其他第三方類,而這些類往往已經被充分測試過,幾乎沒有bug,並且大量應用到程序的其他地方。如果現在為了適應業務發展,便有了新的需求,那麽我們更願意去通過對已有的類進行進一步的封裝,生成新的類,這就是Adapter模式思想。
通過Adapter模式可以很方便地創建實際所需的方法群,當出現bug時,可以很明確的定位,迅速排除不是現有的類(即Adaptee類)。
對於軟件的版本升級與兼容性,也可以應用Adapter模式。例如,假如現在只想維護新版本,這時可以讓新版本扮演Adaptee角色,舊版本扮演Target角色,接著編寫一個Adapter角色的類,這樣子可以很好的解決新版本與舊版本兼容性的問題,而且只需要維護新版本就可以。
值得註意的是,當Target與Adaptee的功能完全不同的時候,使用Adapter模式就完全沒有意義了。
GOF設計模式——Adapter模式