以下是我現階段對適配器模式的認識:
先談一下什麼是適配器
拿我一直想買但是又沒錢買的蘋果筆記本舉例,蘋果筆記本據說沒有USB接口,但是我又有一個超級牛的機械鍵盤cherry 8.0是USB接口的。
但是,我既想用蘋果筆記本,又想用我的cherry 8.0,這時候我就需要買一個適配器,也就是說,我本來有一個類(蘋果筆記本),但是這個類我直接拿來用不了,因爲他提供的接口不是USB接口,這時候我需要一個適配器,將這個類(或者接口)轉化成我可以直接使用形式。
注意這裏還有一種適配器,他是蘋果的口轉各種口。有點像HUB的那種轉換頭。如下圖:
下面介紹適配器模式中的登場角色:
該角色負責定義所需的方法。在我的這個例子中就是上面那張圖片所顯示的,整個適配器設備,由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();
}
}
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
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();
}
}