1. 程式人生 > >GOF設計模式——Adapter模式

GOF設計模式——Adapter模式

tps 交流 註意 對象 super csdn wid sta 適配器

一、什麽是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模式的類的角色一樣。

  • Print
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模式