先直觀感受下什么叫適配器
適配器模式有類的適配器模式和對象的適配器模式兩種不同的形式。
類適配器模式
/**
* 這是一個TypeC的適配器,作為適配器器钟,首先我應當具備讀取TypeC的能里谴餐,其次我還可以讀取USB
* 轉(zhuǎn)換為代碼的話就是TypeCAdapter extends TypeC implements USB
*
*/
public class TypeCAdapter extends TypeC implements USB{
@Override
public void readUSB() {
System.out.println("讀取類U盤的數(shù)據(jù)");
this.readTypeC();
}
}
package adapter;
//我期望我的MacBook可以讀取我僅支持USB口的U盤數(shù)據(jù)
public interface USB {
public void readUSB();
}
package adapter;
/**
* 這是一個TypeC的適配器,作為適配器,首先我應當具備讀取TypeC的能里宿刮,其次我還可以讀取USB
* 轉(zhuǎn)換為代碼的話就是TypeCAdapter extends TypeC implements USB
*
*/
public class TypeCAdapter extends TypeC implements USB{
@Override
public void readUSB() {
System.out.println("讀取類U盤的數(shù)據(jù)");
this.readTypeC();
}
}
package adapter;
public class UDisk {
public static void main(String[] args){
TypeCAdapter adapter = new TypeCAdapter();
adapter.readUSB();
}
}
對象適配器模式
package adapter;
/**
* 我現(xiàn)有一臺可以讀取TypeC數(shù)據(jù)的MacBook
* 也就是即將被適配的對象互站,未來需要用它來讀取USB的數(shù)據(jù)
*/
public class TypeC {
public void readTypeC(){
System.out.println("讀取TypeC的數(shù)據(jù)");
}
}
package adapter;
/**
* 對象適配器
*/
public class TypeCObjectAdapter {
private TypeC typeC;
public TypeCObjectAdapter(TypeC typeC){
this.typeC = typeC;
}
/**
* 此處沒有直接繼承TypeC,而是新建方法僵缺,代理TypeC的readTypeC方法
*/
public void readTypeC(){
typeC.readTypeC();
}
/**
* 此處適配器類提供readUSB的方法
*/
public void readUSB(){
this.readTypeC();
System.out.println("讀取類USB的數(shù)據(jù)");
}
}
類適配器和對象適配器的權(quán)衡
1.類適配器使用對象繼承的方式胡桃,是靜態(tài)的定義方式;對象適配器使用對象組合的方式磕潮,是動態(tài)組合的方式翠胰;
2.對于類適配器,由于適配器直接繼承類adaptee自脯,使得適配器不能和adaptee的子類一起工作之景,因為繼承是靜態(tài)的關(guān)系,當適配器繼承了adaptee后膏潮,就不能再去處理adaptee的子類了锻狗;而對象適配器,可以把源類和它的子類都適配到目標接口焕参。因為對象適配器采用的是對象組合的關(guān)系轻纪,只要對象類型正確,是不是子類都無所謂叠纷;
3.對于類適配器可以重新定義adaptee的部分行為桐磁,相當于子類覆蓋父類的部分實現(xiàn)方法;
4.對于類適配器讲岁,僅僅引入了一個對象我擂,并不需要額外的引用來間接得到Adaptee。對于對象適配器缓艳,需要額外的引用來間接得到Adaptee校摩。
建議盡量使用對象適配器的實現(xiàn)方式,多用合成/聚合阶淘、少用繼承衙吩。當然,具體問題具體分析溪窒,根據(jù)需要來選用實現(xiàn)方式坤塞,最適合的才是最好的。
適配器模式的優(yōu)點
1.更好的復用性
.2系統(tǒng)需要使用現(xiàn)有的類澈蚌,而此類的接口不符合系統(tǒng)的需要摹芙。那么通過適配器模式就可以讓這些功能得到更好的復用。
3.更好的擴展性
.4在實現(xiàn)適配器功能的時候宛瞄,可以調(diào)用自己開發(fā)的功能浮禾,從而自然地擴展系統(tǒng)的功能。
適配器模式的缺點
過多的使用適配器,會讓系統(tǒng)非常零亂盈电,不易整體進行把握蝴簇。比如,明明看到調(diào)用的是A接口匆帚,其實內(nèi)部被適配成了B接口的實現(xiàn)熬词,一個系統(tǒng)如果太多出現(xiàn)這種情況,無異于一場災難吸重。因此如果不是很有必要荡澎,可以不使用適配器,而是直接對系統(tǒng)進行重構(gòu)晤锹。