用電源接口做例子,筆記本電腦的電源一般都是接受5V的電壓炸宵,但是我們生活中的電線電壓一般都是220V的輸出。這個時候就出現(xiàn)了不匹配的狀況,在軟件開發(fā)中我們稱之為接口不兼容性昭,此時就需要適配器來進(jìn)行一個接口轉(zhuǎn)換。在軟件開發(fā)中有一句話正好體現(xiàn)了這點:任何問題都可以加一個中間層來解決县遣。這個層我們可以理解為這里的Adapter層巩梢,通過這層來進(jìn)行一個接口轉(zhuǎn)換就達(dá)到了兼容的目的。
在GOF的設(shè)計模式中艺玲,對適配器模式講了兩種類型括蝠,類適配器模式和對象適配器模式。類適配器模式通過多重繼承進(jìn)行匹配饭聚,但除了C++支持多重繼承忌警,其它語言多不支持。對象適配器使用對象組合的方式秒梳,是動態(tài)組合的方式法绵,只要對象類型正確,是不是子類都無所謂酪碘。建議盡量使用對象適配器的實現(xiàn)方式朋譬,多用合成/聚合、少用繼承兴垦。
一徙赢、類適配器
<pre>
//Target角色
public interface FiveVolt {
public int getVolt5();
}
//Adaptee角色,需要被轉(zhuǎn)換的對象
public class Volt220 {
public int getVolt220() {
return 220;
}
}
// adapter角色
public class ClassAdapter extends Volt220 implements FiveVolt {
@Override
public int getVolt5() {
return 5;
}
}
</pre>
二、對象適配器
<pre>
//Target角色
public interface FiveVolt {
public int getVolt5();
}
//Adaptee角色,需要被轉(zhuǎn)換的對象
public class Volt220 {
public int getVolt220() {
return 220;
}
}
// 對象適配器模式
public class ObjectAdapter implements FiveVolt {
Volt220 mVolt220;
public ObjectAdapter(Volt220 adaptee) {
mVolt220 = adaptee;
}
public int getVolt220() {
return mVolt220.getVolt220();
}
@Override
public int getVolt5() {
return 5;
}
}
</pre>
個人理解:新建一個類去實現(xiàn)目標(biāo)接口的方法探越,其實在內(nèi)部持有了一個老對象狡赐,表面上調(diào)用了新接口方法,實際還是偷偷地用老對象的方法去實現(xiàn)钦幔。
三枕屉、優(yōu)缺點
-
適配器模式的優(yōu)點
- 更好的復(fù)用性
系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要鲤氢。那么通過適配器模式就可以讓這些功能得到更好的復(fù)用搀擂。 - 更好的擴(kuò)展性
在實現(xiàn)適配器功能的時候,可以調(diào)用自己開發(fā)的功能卷玉,從而自然地擴(kuò)展系統(tǒng)的功能哨颂。
- 更好的復(fù)用性
適配器模式的缺點
過多的使用適配器,會讓系統(tǒng)非常零亂揍庄,不易整體進(jìn)行把握咆蒿。比如,明明看到調(diào)用的是A接口,其實內(nèi)部被適配成了B接口的實現(xiàn)沃测,一個系統(tǒng)如果太多出現(xiàn)這種情況缭黔,無異于一場災(zāi)難。因此如果不是很有必要蒂破,可以不使用適配器缺前,而是直接對系統(tǒng)進(jìn)行重構(gòu)恕齐。