java中的適配器模式

以下是我現階段對適配器模式的認識:


先談一下什麼是適配器

拿我一直想買但是又沒錢買的蘋果筆記本舉例,蘋果筆記本據說沒有USB接口,但是我又有一個超級牛的機械鍵盤cherry 8.0是USB接口的。

但是,我既想用蘋果筆記本,又想用我的cherry 8.0,這時候我就需要買一個適配器,也就是說,我本來有一個類(蘋果筆記本),但是這個類我直接拿來用不了,因爲他提供的接口不是USB接口,這時候我需要一個適配器,將這個類(或者接口)轉化成我可以直接使用形式。

注意這裏還有一種適配器,他是蘋果的口轉各種口。有點像HUB的那種轉換頭。如下圖:



下面介紹適配器模式中的登場角色:

1.Target(對象)

該角色負責定義所需的方法。在我的這個例子中就是上面那張圖片所顯示的,整個適配器設備,由Print(這個Print可以是接口也可以是抽象類,後面我將針對這兩種情況進行詳細的討論)扮演該角色。

2.Client(請求者)

該角色負責使用Target角色所定義的方法進行具體的處理。在我的這個例子中是櫻桃鍵盤,在示例程序中,由Main類扮演此角色。

3.Adaptee(被適配)

注意!這裏是被適配,在我的例子中是蘋果筆記本,在示例程序中由Banner類扮演此角色。

4.Adapter(適配)

這個是適配器模式的主人公,但是也是最不好理解的,看上面那個圖,那個適配器不是有多個口嗎,有轉換成USB的口,有轉換成其他類型的口。在我的這個例子中,適配器就是那麼多的口中,轉換成USB的那個口,因爲我的鍵盤是USB口,其他口我不需要。在示例代碼中由PrintBanner類扮演這個角色。

//1.Target(對象)扮演者
public interface Print {
    public abstract void printWeak();

    public abstract void printStrong();

}

//2.Client(請求者)扮演者
public class Main {
    public static void main(String[] args) {
        Print p = new PrintBanner("hello");
        p.printWeak();
        p.printStrong();
    }
}

//Adaptee(被適配)角色扮演者
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 + "*");
    }
}

//Adapter(適配)扮演者
public class PrintBanner extends Banner implements Print {

    public PrintBanner(String string) {
        super(string);
    }

    public void printWeak() {
        showWithParen();
    }

    public void printStrong() {
        showWithAster();
    }
}

這裏看Main方法中,他使用的是Print接口,也就是使用的是第一張圖中的適配器設備。然後指向的是PrintBanner也就是那個USB接口爲我提供服務。
這裏用接口就有一個嚴重的問題了。我實現Print接口,我就要重寫接口中的所有方法。但是現實生活中你也知道,我買了一個轉換器,我可能就用其中一個轉換口,其他口我都空着不用!
這時候就想到了,能不能把Print用抽象類代替。但是問題又出來了。如果用抽象類,我的PrintBanner不能即繼承Banner又繼承Print。這時我就只能通過"委託"的方式,即"交給其他人"去做。下面是對Print和PrintBanner的改造:(其實我這個新的Print寫的不太好,因爲,抽象類中的非抽象方法不用重寫,其他必須重寫,接口的方法必須重寫,讀者自己搞明白這裏就行。)
public abstract class Print {
    public abstract void printWeak();

    public abstract void printStrong();
}
因爲我新的這個Print中的方法給寫成抽象的了,所以子類必須重寫了。其實這裏別寫成抽象讀者理解起來更合適。
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();
    }
}





發佈了21 篇原創文章 · 獲贊 17 · 訪問量 8650
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章