1、認識適配器模式
- 適配器的核心目的就是讓原本不相關聯(lián)的兩件東西东抹,變得兼容秩冈。
其實就是利用java語言的多態(tài)特性(繼承本缠、接口) , 將繼承獲取到的基類api 入问, 根據(jù)業(yè)務需求適配到對應的接口api中丹锹,把原先不相關、不兼容的東西队他,變得兼容卷仑。 - 按寫法可以分為 類適配 和 對象適配。
分別舉例來看看:
類適配(繼承方式):
/**
* @author jay
* @since 2021/01/25
* @description: 業(yè)務場景將小米電池適配到其他品牌手機麸折,如華為手機
*/
public class PhoneElecAdaptor extends XIaoMiMobile implements HuaWeiBatteryChange {
@Override
public void batteryExchange() {
//由繼承得來
xmbattery();
}
}
//小米手機
class XIaoMiMobile {
public void xmbattery(){
System.out.println("小米手機電池");
}
}
//華為電池轉換器接口
interface HuaWeiBatteryChange {
void batteryExchange();
}
對象適配(組合方式):
/**
* @author jay
* @since 2021/01/25
* @description: 業(yè)務場景:用小米手機充電器給其他品牌手機充電,如華為手機
*/
public class MobileChargerAdaptor implements HuaWeiCharger{
//組合方式引入
XiaomiCharger xiaomiCharger;
public MobileChargerAdaptor(XiaomiCharger xiaomiCharger){
this.xiaomiCharger = xiaomiCharger;
}
@Override
public void chargingHW() {
xiaomiCharger.chargingXM();
}
//輸出xm mobile is charging
public static void main(String[] args) {
MobileChargerAdaptor mm = new MobileChargerAdaptor(new XiaomiMobile());
mm.chargingHW();
}
}
//華為充電器
interface HuaWeiCharger{
void chargingHW();
}
//華為手機充電
class HuaWeiMobile implements HuaWeiCharger{
@Override
public void chargingHW() {
System.out.println("huawei mobile is charging");
}
}
//小米手機充電器
interface XiaomiCharger{
void chargingXM();
}
//小米手機充電
class XiaomiMobile implements XiaomiCharger{
@Override
public void chargingXM() {
System.out.println("xm mobile is charging");
}
}
2粘昨、優(yōu)缺點分析
類適配方式:
優(yōu)點
- 高擴展性和復用率:類適配器直接借助了繼承垢啼,讓程序變得靈活,讓被繼承的類的api復用率很高张肾。
- 符合開閉原則芭析,任意新建適配類,不用修改基類的代碼吞瞪。
缺點
- 單繼承 也就是java語言本身繼承的缺點 : 單繼承結構馁启。基類中的子類無法訪問到。
ps:如果能做到這點就顯得特別強大了惯疙。
對象適配(組合)方式:
- 優(yōu)點 : 相對類適配繼承方式翠勉,顯然訪問范圍更廣,通過對象可以訪問類中的各個屬性方法霉颠。也是面向接口編程的一個思想體現(xiàn)对碌。
- 缺點 : 由于整個對象強引入,耦合度高蒿偎。一旦類中方法修改朽们,比較不好改。
3诉位、使用場景
- 當前類的api不滿足需要骑脱,又要用到這個類,就可以使用適配器模式苍糠,進行改造惜姐,變得兼容
- 想建立一個具有通用特點的類,將來可以到處重復使用椿息。
4歹袁、開源框架中的案例
SpringMVC HTTP請求處理 :
DispatcherServlet -> init() -> initServletBean ->
initWebApplicationContext -》 onRefresh -》
initHandlerAdapters