html個(gè)人主頁(yè)制作seo運(yùn)營(yíng)學(xué)校
目錄
適配器模式概念
主要實(shí)現(xiàn)方式
主要組成
UML用例圖
代碼示例
生活場(chǎng)景
應(yīng)用場(chǎng)景
適配器模式概念
適配器模式屬于結(jié)構(gòu)型設(shè)計(jì)模式,它的主要目的是將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)端所期望的另一種接口形式,使得原本接口不兼容的類(lèi)可以一起工作。
主要實(shí)現(xiàn)方式
- 類(lèi)適配器。類(lèi)適配器的實(shí)現(xiàn)需要支持多繼承(如C++),因?yàn)樵擃?lèi)型適配器是通過(guò)多繼承被適配者和目標(biāo)接口,由于目標(biāo)接口可以是抽象類(lèi)或者接口,被適配者可以是類(lèi)或接口。所以兩者都有可能是類(lèi)。自然不適用于單繼承。
- 對(duì)象適配器。對(duì)象適配器不需要多繼承,單繼承就行(如Java)。該類(lèi)型適配器通過(guò)將被適配器者作為屬性引用(就像Spring中的屬性注入)。這種方式更加靈活,因?yàn)樗灰蕾?lài)于被適配者的具體實(shí)現(xiàn),只需要知道它的接口即可。
主要組成
- 目標(biāo)接口(target)。?客戶(hù)端所期待的接口。目標(biāo)接口可以是抽象類(lèi)或接口,定義了客戶(hù)端期望的方法。
- 被適配者(adaptee)。需要適配的類(lèi)或接口。包含一些客戶(hù)端可能需要的方法,但接口形式與客戶(hù)端所期望的接口不兼容。
- 適配器(adapter)。適配器類(lèi)是核心,它將被適配者的接口轉(zhuǎn)換成目標(biāo)接口。主要有兩種,類(lèi)適配器和對(duì)象適配器。通過(guò)實(shí)現(xiàn)目標(biāo)接口,被適配者作為該類(lèi)屬性以及傳入被適配者實(shí)例(適用對(duì)象適配器)或者繼承被適配者類(lèi)(適用類(lèi)適配器),目的調(diào)用被適配者的方法。最終返回一個(gè)目標(biāo)實(shí)例,也就是適配器實(shí)例,通過(guò)調(diào)用適配器中的方法,完成接口轉(zhuǎn)換。
UML用例圖
以對(duì)象適配器為例
代碼示例
?以對(duì)象適配器為例,舉個(gè)例子,生活中的插頭有兩腳的、三腳的,之間就需要轉(zhuǎn)換。接下來(lái)使用代碼將三腳轉(zhuǎn)為兩腳插頭使用。
兩腳插頭接口(目標(biāo))
// 兩腳插頭接口
public interface TwoPinPlug {void connectionTwoPin();
}
三腳插頭類(lèi)(被適配者)
// 三角插頭接口
public interface ThreePinPlug {void connectionThreePin();
}// 三角插頭實(shí)現(xiàn)
public class ThreePinPlugImpl implements ThreePinPlug {@Overridepublic void connectionThreePin() {System.out.println("三角插頭連接成功");}
}
適配器類(lèi)
// 適配器類(lèi),將三腳轉(zhuǎn)為兩腳,實(shí)現(xiàn)兩腳接口,成為兩腳接口的子類(lèi)
public class PlugPinAdapter implements TwoPinPlug {// 三角(源)屬性注入private ThreePinPlug threePlug;// 有參構(gòu)造,傳入三腳(源)接口public PlugPinAdapter(ThreePinPlug threePlug) {this.threePlug = threePlug;}@Overridepublic void connection() {// 調(diào)用三腳(源)接口threePlug.connection();System.out.println("通過(guò)適配器轉(zhuǎn)換...");System.out.println("轉(zhuǎn)換成為兩腳插頭");}
}
客戶(hù)端
public class Client {public static void main(String[] args) {// 創(chuàng)建一個(gè)三腳插頭實(shí)例ThreePinPlugImpl threePlug = new ThreePinPlugImpl();// 創(chuàng)建插頭適配器,傳入三腳插頭實(shí)例,返回兩腳插頭實(shí)例TwoPinPlug twoPinPlug = new PlugPinAdapter(threePlug);// 執(zhí)行兩腳插頭實(shí)例方法(其實(shí)也是適配器中的方法)twoPinPlug.connectionTwoPin();}
}
結(jié)果
生活場(chǎng)景
- 耳機(jī)轉(zhuǎn)換頭:現(xiàn)在有的手機(jī)是沒(méi)有耳機(jī)插孔的,但是充電的地方其實(shí)也可以充當(dāng)耳機(jī)孔,這時(shí)候就需要耳機(jī)轉(zhuǎn)換的適配器,轉(zhuǎn)成手機(jī)支持的插孔。
- 電壓轉(zhuǎn)換器:生活中常見(jiàn)的充電器,就是將220V電壓轉(zhuǎn)換成充電設(shè)備支持的電壓。
應(yīng)用場(chǎng)景
- JDBC驅(qū)動(dòng)程序:不同的數(shù)據(jù)庫(kù)提供商實(shí)現(xiàn)了不同的JDBC驅(qū)動(dòng)接口,使用適配器模式可以將這些不同的接口適配為標(biāo)準(zhǔn)的JDBC接口,提高應(yīng)用程序的可移植性
- 處理器適配器(HandlerAdapter):SpringMVC工作流程中的出現(xiàn)的處理器適配器(HandlerAdapter),前端控制器(DispatcherServlet)會(huì)根據(jù)找到的處理器,選擇一個(gè)合適的HandlerAdapter。HandlerAdapter有多個(gè)實(shí)現(xiàn),用于適配不同類(lèi)型的處理器。在這個(gè)過(guò)程中,處理器適配器(HandlerAdapter)起到了橋梁的作用,它連接了DispatcherServlet和具體的處理器(Controller),使得不同類(lèi)型的處理器能夠被統(tǒng)一調(diào)用和執(zhí)行。