擴充卡模式概述:
如果去歐洲國家去旅遊的話,他們的插座如下圖最左邊,是歐洲标準。而我們使用的插頭如下圖最右邊的。是以我們的筆記本電腦,手機在當地不能直接充電。是以就需要一個插座轉換器,轉換器第1面插入當地的插座,第2面供我們充電,這樣使得我們的插頭在當地能使用。生活中這樣的例子很多,手機充電器(将220v轉換為5v的電壓),讀卡器等,其實就是使用到了擴充卡模式。
- 定義: 将一個類的接口轉換成客戶希望的另外一個接口,使得原本由于接口不相容而不能一起工作的那些類能一起工作。
-
擴充卡模式的結構:
擴充卡模式(Adapter)包含以下主要角色:
目标(Target)接口:目前系統業務所期待的接口,它可以是抽象類或接口。
适配者(Adaptee)類:它是被通路和适配的現存元件庫中的元件接口。
擴充卡(Adapter)類:它是一個轉換器,通過繼承或引用适配者的對象,把适配者接口轉換成目标接口,讓客戶按目标接口的格式通路适配者。
對照上圖了解:
-
擴充卡模式的分類:
(1)、類擴充卡(通過繼承,耦合高)
(2)、對象擴充卡(通過組合,聚合)
前者類之間的耦合度比後者高,且要求程式員了解現有元件庫中的相關元件的内部結構,是以應用相對較少些。
類擴充卡模式:
【例】讀卡器
現有一台電腦隻能讀取SD卡,而要讀取TF卡中的内容的話就需要使用到擴充卡模式。建立一個讀卡器,将TF卡中的内容讀取出來。
類圖如下:
- 電腦隻能讀取寫入SDcard類型的資料,不能讀取和寫入TFCard類型裡面的資料,要想電腦能對TFCard裡面的資料進行讀取,就要用到擴充卡模式。
//SD卡的接口
public interface SDCard {
//讀取SD卡方法
String readSD();
//寫入SD卡功能
void writeSD(String msg);
}
//SD卡實作類
public class SDCardImpl implements SDCard {
public String readSD() {
String msg = "sd card read a msg :hello word SD";
return msg;
}
public void writeSD(String msg) {
System.out.println("sd card write msg : " + msg);
}
}
//電腦類
public class Computer {
public String readSD(SDCard sdCard) {
if(sdCard == null) {
throw new NullPointerException("sd card null");
}
return sdCard.readSD();
}
}
//TF卡接口
public interface TFCard {
//讀取TF卡方法
String readTF();
//寫入TF卡功能
void writeTF(String msg);
}
//TF卡實作類
public class TFCardImpl implements TFCard {
public String readTF() {
String msg ="tf card read msg : hello word tf card";
return msg;
}
public void writeTF(String msg) {
System.out.println("tf card write a msg : " + msg);
}
}
//定義擴充卡類(SD相容TF)
public class SDAdapterTF extends TFCardImpl implements SDCard {
public String readSD() {
System.out.println("adapter read tf card ");
return readTF();
}
public void writeSD(String msg) {
System.out.println("adapter write tf card");
writeTF(msg);
}
}
//測試類
public class Client {
public static void main(String[] args) {
Computer computer = new Computer();
SDCard sdCard = new SDCardImpl();
System.out.println(computer.readSD(sdCard));
System.out.println("------------");
SDAdapterTF adapter = new SDAdapterTF();
System.out.println(computer.readSD(adapter));
}
}
-
缺點:
類擴充卡模式違背了合成複用原則。類擴充卡是客戶類有一個接口規範的情況下可用,反之不可用。
對象擴充卡模式
實作方式:對象擴充卡模式可釆用将現有元件庫中已經實作的元件引入擴充卡類中,該類同時實作目前系統的業務接口。
上面的案例:使用對象擴充卡模式的類圖
可以發現,其他地方沒有改動,改動的隻是擴充卡和适配者之間的聯系方式,原來通過擴充卡
繼承
适配者實作類,現在通過擴充卡
聚合
适配者接口
-
優點:
(1)目标接口,沒有标準接口的時候還是可用的,直接繼承目标接口的實作就行了。
(2)對象擴充卡模式遵守了合成複用原則
//建立擴充卡對象(SD相容TF)
public class SDAdapterTF implements SDCard {
private TFCard tfCard;
public SDAdapterTF(TFCard tfCard) {
this.tfCard = tfCard;
}
public String readSD() {
System.out.println("adapter read tf card ");
return tfCard.readTF();
}
public void writeSD(String msg) {
System.out.println("adapter write tf card");
tfCard.writeTF(msg);
}
}
//測試類
public class Client {
public static void main(String[] args) {
Computer computer = new Computer();
SDCard sdCard = new SDCardImpl();
System.out.println(computer.readSD(sdCard));
System.out.println("------------");
TFCard tfCard = new TFCardImpl();
SDAdapterTF adapter = new SDAdapterTF(tfCard);
System.out.println(computer.readSD(adapter));
}
}
使用場景
- 以前開發的系統存在滿足新系統功能需求的類,但其接口同新系統的接口不一緻。
- 使用第三方提供的元件,但元件接口定義和自己要求的接口定義不同。