Java設計模式 之 適配器模式
假設現在有個需求是爲小米手機充電,但是我們現在只有蘋果的Lightning的充電器,小米只支持 TypeC接口 及 Usb接口充電 ,這時候會想到爲蘋果充電器適配這兩種接口,代碼如何實現呢?
這時候我們選擇 適配器模式 就可以比較完美解決我們的問題:
我們先爲TypeC充電器適配,先構造一個充電器的接口,代碼如下:
public interface ITypeCCharger {
//充電
void charge();
}
再構建個TypeC充電器設配器設配蘋果Ligntning充電器,
public class LightningCharger implements ITypeCCharger{
@Override
public void charge() {
//輸入電源,手機充電
}
}
以接口的實現方式實現適配
public class TypeCChargerAdapter implements ITypeCCharger{
LightningCharger lightningCharger;
@Override
public void charge() {
// 使用Lightning充電器爲手機充電
lightningCharger.charge();
}
}
此時爲小米手機充電,充電顯示正常,代碼如下:
public class XiaomiPhone {
TypeCChargerAdapter adapter = new TypeCChargerAdapter();
//傳入adapter對象
public void chargeFrom(ITypeCCharger charger) {
charger.charge();
}
}
我們可以發現小米手機類chargeFrom充電的時候不會關心具體類的實現,只要的可以符合接口的規劃就可以,這就是適配器模式,適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。
其中適配器可以分爲 類適配器 及 對象適配器 ,上面的例子是 對象適配器 主要用接口實現,我們再舉個Usb的例子,用類適配器模式描寫,代碼如下:
//usb充電器
public class UsbCharger{
public void charge() {
}
}
以繼承的實現方式實現適配
public class UsbChargeAdapter extends UsbCharger{
LightningCharger lightningCharger;
@Override
public void charge() {
lightningCharger.charge();
}
}
手機充電
public class XiaomiPhone {
public void chargeFrom(UsbCharger charger) {
charger.charge();
}
}
那兩個有什麼區別呢,其實差別很小,對象適配器是以組合來實現,類適配器是以繼承來實現,那什麼時候使用哪種模式呢?
當你知道只需要適配 一個特定的類的 話,你可以使用類適配器,可以減少代碼量,
但你需要 對象可以極大擴展 則可以選擇對象適配器用接口來實現,這可以極大的擴展代碼的靈活性。
其他模式可點擊鏈接進目錄閱讀了解:http://blog.csdn.net/xiao_wanzi94/article/details/78118092