設計模式——適配器模式

  適配器模式的定義:將一個類的接口,轉換成客戶指望的另外一個接口。適配器讓本來接口不兼容的類能夠合做無間。ide

  適配器模式其實也能夠叫作轉換器模式,由定義可知適配器其實就是包裝某些對象從而讓他們的幾口開起來不像本身而像是別的東西。舉一個簡單的例子 :
測試

  假設如今已有一個軟件系統,你但願它能和一個新的廠商類庫搭配使用,可是這個新廠商所設計出來的接口不一樣於舊廠商的接口,以下圖所示:
this

  

  此時若是不想改變現有代碼解決這個問題,就能夠從新寫一個類,這個類負責將新廠商接口轉接成你所指望的接口,這個類就是一個適配器:
編碼

  

  這個適配器實現了你的類所指望的接口,並且這個適配器也能和廠商的接口溝通,這個適配器工做起來就如同一箇中間人,它將客戶所發出的請求轉換成廠商類能理解的請求,這就是適配器模式。
spa

  再經過代碼的例子來詳細瞭解一下這個模式,如今有一個鴨子和火雞的接口聲明以下:設計

public interface Duck {

    public void quack();

    public void fly_long();
}
public interface Turkey {
    public void gobble();

    public void fly_short();
}

  實現一個具體的鴨子和火雞類code

public class MallardDuck implements Duck {

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        System.out.println("Quack!");
    }

    @Override
    public void fly_long() {
        // TODO Auto-generated method stub
        System.out.println("I'm flying!");
    }

}
public class WildTurkey implements Turkey {

    @Override
    public void gobble() {
        // TODO Auto-generated method stub
        System.out.println("Gobble!");

    }

    @Override
    public void fly_short() {
        // TODO Auto-generated method stub
        System.out.println("I'm flying a short distance");
    }

}

  如今假設你缺乏鴨子對象,想用一些火雞對象來冒充,顯而易見由於火雞的接口不一樣,因此不能直接拿來用,因此寫個適配器類完成這個轉化過程:對象

public class TurkeyAdapter implements Duck {
    Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    @Override
    public void quack() {
        // TODO Auto-generated method stub
        turkey.gobble();
    }

    @Override
    public void fly_long() {
        // TODO Auto-generated method stub
        for (int i = 0; i < 5; i++) {//變成可以長距離飛行
            turkey.fly_short();
        }
    }

}

  測試一下:blog

public class DuckTestDriver {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MallardDuck duck = new MallardDuck();

        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey);

        System.out.println("The Turkey says...");
        turkey.gobble();
        turkey.fly_short();

        System.out.println("\nThe Duck says...");
        testDuck(duck);
        
        System.out.println("\nThe TurkeyAdapter says...");
        testDuck(turkeyAdapter);//這裏的鴨子實際上是一個火雞冒充的

    }

    static void testDuck(Duck duck) {
        duck.quack();
        duck.fly_long();
    }

}

  打印結果:接口

The Turkey says...
Gobble!
I'm flying a short distance

The Duck says...
Quack!
I'm flying!

The TurkeyAdapter says...
Gobble!
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance
I'm flying a short distance

  總之:

  (1)當須要使用一個現有的類而其接口並不符合你的須要時,就使用適配器,適配器改變接口以符合客戶的指望。

  (2)實現一個適配器可能須要一番功夫,也可能不費功夫,視目標接口的大小與複雜度而定(爲何這麼說是由於適配器並非只能包裝一個類儘管上邊的例子確實只包裝了一個火雞類,能夠經過適配器來適配許多類來提供一個接口讓客戶編碼)。

相關文章
相關標籤/搜索