概述
如果去歐洲國(guó)家去旅游的話,他們的插座如下圖最左邊活烙,是歐洲標(biāo)準(zhǔn)遣鼓。而我們使用的插頭如下圖最右邊的骑祟。因此我們的筆記本電腦气笙,手機(jī)在當(dāng)?shù)夭荒苤苯映潆姺叟隆K跃托枰粋€(gè)插座轉(zhuǎn)換器抒巢,轉(zhuǎn)換器第1面插入當(dāng)?shù)氐牟遄让眨?面供我們充電,這樣使得我們的插頭在當(dāng)?shù)啬苁褂每脱唷I钪羞@樣的例子很多狰贯,手機(jī)充電器(將220v轉(zhuǎn)換為5v的電壓)涵紊,讀卡器等,其實(shí)就是使用到了適配器模式摸柄。
定義
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口驱负,使得原本由于接口不兼容而不能一起工作的那些類能一起工作跃脊。
一句話總結(jié)就是: 通過(guò)適配把不能用的轉(zhuǎn)換成能用的
適配器模式分為類適配器模式和對(duì)象適配器模式,前者類之間的耦合度比后者高捞稿,且要求程序員了解現(xiàn)有組件庫(kù)中的相關(guān)組件的內(nèi)部結(jié)構(gòu)拼缝,所以應(yīng)用相對(duì)較少些。
結(jié)構(gòu)
適配器模式(Adapter)包含以下主要角色:
-目標(biāo)(Target)接口:當(dāng)前系統(tǒng)業(yè)務(wù)所期待的接口衰齐,它可以是抽象類或接口继阻。
-適配者(Adaptee)類:它是被訪問(wèn)和適配的現(xiàn)存組件庫(kù)中的組件接口。
-適配器(Adapter)類:它是一個(gè)轉(zhuǎn)換器澈蟆,通過(guò)繼承或引用適配者的對(duì)象卓研,把適配者接口轉(zhuǎn)換成目標(biāo)接口,讓客戶按目標(biāo)接口的格式訪問(wèn)適配者寥闪。
類適配器模式
實(shí)現(xiàn)方式:定義一個(gè)適配器類來(lái)實(shí)現(xiàn)當(dāng)前系統(tǒng)的業(yè)務(wù)接口磨淌,同時(shí)又繼承現(xiàn)有組件庫(kù)中已經(jīng)存在的組件梁只。
現(xiàn)有一臺(tái)電腦只能讀取SD卡,而要讀取TF卡中的內(nèi)容的話就需要使用到適配器模式秋忙。創(chuàng)建一個(gè)讀卡器淤翔,將TF卡中的內(nèi)容讀取出來(lái)。在這個(gè)例子中监嗜,SD卡為目標(biāo)接口裁奇,TF卡為適配者麦撵,我們需要?jiǎng)?chuàng)建一個(gè)適配者類
1、創(chuàng)建電腦類
//電腦類
public class Computer {
public String readSD(SDCard sdCard) {
if(sdCard == null) {
throw new NullPointerException("sd card null");
}
return sdCard.readSD();
}
}
2音五、創(chuàng)建目標(biāo)接口
//SD卡的接口
public interface SDCard {
//讀取SD卡方法
String readSD();
//寫入SD卡功能
void writeSD(String msg);
}
//SD卡實(shí)現(xiàn)類
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);
}
}
3羔沙、創(chuàng)建適配者
//TF卡接口
public interface TFCard {
//讀取TF卡方法
String readTF();
//寫入TF卡功能
void writeTF(String msg);
}
//TF卡實(shí)現(xiàn)類
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);
}
}
4扼雏、使用類適配模式創(chuàng)建適配器
//定義適配器類(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);
}
}
適配器沒(méi)有改變目標(biāo)對(duì)象,通過(guò)適配類實(shí)現(xiàn)SDCard的接口并繼承TFCard實(shí)現(xiàn)類诱建,讓它把TF卡跟SD卡建立了關(guān)聯(lián)碟绑。
5、測(cè)試
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));
}
}
類圖
缺點(diǎn):
1汽抚、類適配器模式違背了合成復(fù)用原則。
2否过、類適配器是客戶類有一個(gè)接口規(guī)范的情況下可用惭蟋,反之不可用(接口隔離原則)。
對(duì)象適配器模式
實(shí)現(xiàn)方式:對(duì)象適配器模式可釆用將現(xiàn)有組件庫(kù)中已經(jīng)實(shí)現(xiàn)的組件引入適配器類中煤伟,該類同時(shí)實(shí)現(xiàn)當(dāng)前系統(tǒng)的業(yè)務(wù)接口木缝。
【例】讀卡器
代碼如下:
類適配器模式的代碼我碟,我們只需要修改適配器類(SDAdapterTF)和測(cè)試類。
//創(chuàng)建適配器對(duì)象(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);
}
}
//測(cè)試類
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));
}
}
注意:還有一個(gè)適配器模式是接口適配器模式吱殉。當(dāng)不希望實(shí)現(xiàn)一個(gè)接口中所有的方法時(shí)友雳,可以創(chuàng)建一個(gè)抽象類Adapter 伊群,實(shí)現(xiàn)所有方法策精。而此時(shí)我們只需要繼承該抽象類即可崇棠。
應(yīng)用場(chǎng)景
- 以前開(kāi)發(fā)的系統(tǒng)存在滿足新系統(tǒng)功能需求的類枕稀,但其接口同新系統(tǒng)的接口不一致萎坷。
- 使用第三方提供的組件,但組件接口定義和自己要求的接口定義不同蔽挠。