適配器模式
適配器模式數(shù)據(jù)結(jié)構(gòu)型設(shè)計(jì)模式.
適配器模式主要用于將2個(gè)不能兼容的物件結(jié)合在一起.分為類適配器和對(duì)象適配器.
比如由于2個(gè)類因?yàn)榻涌趩栴}沒辦法在一起工作,可以使用適配器模式將其結(jié)合起來.
比如生活中的電源適配器,A物品需要100V電壓,B物品需要220V電壓,直接作用其中有一個(gè)無法達(dá)到效果,而電源適配器支持100~220V就可以完美解決這樣的問題.
應(yīng)用場(chǎng)景
- 重構(gòu)過程中要具體使用當(dāng)前某個(gè)類,但是因?yàn)榻涌趩栴}無法兼容
- 具有統(tǒng)一輸出性質(zhì),輸入類型不確定的對(duì)象
- 第三方組件接口定義與自身的不同,在不修改自身接口的情況下要使用第三方組件接口
代碼示例(類適配器)
(一)獲取電壓的接口
public interface Voltage {
void getVoltage();
}
(二)物件A實(shí)現(xiàn)電壓接口獲取220V電壓
public class Voltage220 implements Voltage {
@Override
public void getVoltage() {
System.out.print("\n"+"正常物件B:獲取220的電壓");
}
}
(三)物件B的110V電壓(重構(gòu)過程中需要使用它又不能破壞之前的接口)
public void getVoltage100(){
System.out.print("\n"+"特殊物件B:獲取100的電壓");
}
}
(四)電源適配器
public class PowerAdapter extends Voltage100 implements Voltage{
@Override
public void getVoltage() {
super.getVoltage100();
}
}
繼承原本的110V電壓并且實(shí)現(xiàn)正常220V電壓,統(tǒng)一到一個(gè)類進(jìn)行處理
調(diào)用方式
Voltage voltage=new Voltage220();
voltage.getVoltage();
Voltage voltage1=new PowerAdapter();
voltage1.getVoltage();
根據(jù)自己的需要來選擇創(chuàng)建符合需要的子類實(shí)現(xiàn)具體功能。
代碼示例(對(duì)象適配器)
在上述的類適配器中使用的方式是先繼承在實(shí)現(xiàn)具體的方法來進(jìn)行適配,而對(duì)象適配器中則直接將對(duì)象進(jìn)行關(guān)聯(lián),更為靈活方便.
(一)直接關(guān)聯(lián)被適配類的適配器
public class AbstractPowerAdapter implements Voltage {
//適配類為100V電壓
private Voltage100 voltage100;
public AbstractPowerAdapter(Voltage100 voltage100) {
this.voltage100 = voltage100;
}
@Override
public void getVoltage() {
voltage100.getVoltage100();
}
}
調(diào)用方式
Voltage100 voltage3=new Voltage100();
Voltage voltage4=new AbstractPowerAdapter(voltage3);
voltage4.getVoltage();
顯示結(jié)果如同上述的類適配器一致.
對(duì)象適配器直接在構(gòu)造參數(shù)中將適配的類進(jìn)行關(guān)聯(lián),這樣我們可以關(guān)聯(lián)多個(gè)不同的適配類.
總結(jié)
優(yōu)點(diǎn)
客戶端調(diào)用同一個(gè)接口方法
目標(biāo)類與適配類解耦
適配器可以將不同的適配類都適配到目標(biāo)接口
缺點(diǎn)
整體修改適配器的實(shí)現(xiàn)過程復(fù)雜
項(xiàng)目中大量使用適配器模式,會(huì)讓項(xiàng)目復(fù)雜.不利于整體維護(hù)使用