在介紹適配器模式之前,我們先了解一下設(shè)計(jì)模式
?????? 設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多數(shù)人知曉的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。目的是為了可重用性代碼,讓代碼更容易被他人理解,保證代碼可靠性。
??
適配器(Adapter)模式
???????適配器模式使我們可以重用一個(gè)現(xiàn)有的類,以滿足客戶端的需要。當(dāng)客戶端通過接口表達(dá)其需求時(shí),通??梢詣?chuàng)建一個(gè)實(shí)現(xiàn)了該接口的新類,同時(shí)使該類繼承自現(xiàn)有類。這種方式即類的適配器,它能夠?qū)⒖蛻舳说恼{(diào)用轉(zhuǎn)換為對(duì)現(xiàn)有類方法的調(diào)用。
主要分為三類:類適配器模式、對(duì)象的適配器模式、接口的適配器模式。
1.類適配器模式
小農(nóng)解釋
?????? 適配器模式使我們可以重用一個(gè)現(xiàn)有的類,以滿足客戶端的需要。當(dāng)客戶端通過接口表達(dá)其需求時(shí),通??梢詣?chuàng)建一個(gè)實(shí)現(xiàn)了該接口的新類,同時(shí)使該類繼承自現(xiàn)有類。這種方式即類的適配器,它能夠?qū)⒖蛻舳说恼{(diào)用轉(zhuǎn)換為對(duì)現(xiàn)有類方法的調(diào)用。
首先看一個(gè)簡單的例子,通過這個(gè)例子來理解類適配器模式。
/* 接口Ps */
public?interface?Ps {
????void?isPs();
}
/* 接口Usb */
public?interface?Usb {
????void?isUsb();
}
/* 實(shí)現(xiàn)Usb接口 */
public?class?Usber implements?Usb {
????@Override
????public?void?isUsb() {
????????System.out.println("Usb接口");
????}
}
/* 適配器類繼承實(shí)現(xiàn)Usb接口,實(shí)現(xiàn)Ps接口 */
public?class?Adapter extends?Usber implements?Ps {
??? @Override
????public?void?isPs() {
?????????System.out.println("適配器類--start--");
?????????isUsb();
?????????System.out.println("適配器類--end--");
????}
}
/* 測(cè)試類 */
public?class?Test {
????public?static?void?main(String[] args) {
????????Ps p?= new?Adapter();
????????p.isPs();
??? }
}
輸出結(jié)果:
小農(nóng)解釋
??手里有ps插頭的設(shè)備,但是主機(jī)上只有Usb插頭的插口。
? ? ? 那怎么辦呢?這時(shí)就需要一個(gè)轉(zhuǎn)換器,將ps插頭轉(zhuǎn)換成Usb插頭就可以使用了。
????? 接口Ps:描述ps接口格式。
? ? ? 接口Usb:描述Usb接口格式。
? ? ? 類Usber:是接口Usb的實(shí)現(xiàn)類,是具體的Usb接口格式。
????? Adapter:用于ps接口格式轉(zhuǎn)換成為Usb接口格式。
2.對(duì)象適配器模式
小農(nóng)解釋
??????對(duì)象適配器和類適配器其實(shí)算是同一種思想,只不過實(shí)現(xiàn)方式不同。
????? 根據(jù)合成復(fù)用原則,組合大于繼承,所以它解決了類適配器必須繼承Usber 的局限性問題,同樣的它使用成本更低,更靈活。
/* 適配器類*/
public?class?Adapter ?implements?Ps {
???????? private?Usb usb;
???????? public?Adapter(Usb usb){
????????????????this.usb?= usb;
??????? }
??????? @Override
??????? public?void?isPs() {
?????????????????System.out.println("適配器類--start--");
?????????????????isUsb();
?????????????????System.out.println("適配器類--end--");
??????? }
}
/* 測(cè)試類*/
public?class?Test {
????public?static?void?main(String[] args) {
?? ????Ps p?= new?Adapter(new?Usber());
?? ????p.isPs();
????}
}
輸出結(jié)果:
3.接口適配器模式
小農(nóng)解釋
??????當(dāng)存在這樣一個(gè)接口,其中定義了N多的方法,而我們現(xiàn)在卻只想使用其中的一個(gè)到幾個(gè)方法,如果我們直接實(shí)現(xiàn)接口,那么我們要對(duì)所有的方法進(jìn)行實(shí)現(xiàn),哪怕我們僅僅是對(duì)不需要的方法進(jìn)行置空(只寫一對(duì)大括號(hào),不做具體方法實(shí)現(xiàn))也會(huì)導(dǎo)致這個(gè)類變得臃腫,調(diào)用也不方便,這時(shí)我們可以使用一個(gè)抽象類作為中間件,即適配器,用這個(gè)抽象類實(shí)現(xiàn)接口,而在抽象類中所有的方法都進(jìn)行置空,那么我們?cè)趧?chuàng)建抽象類的繼承類,而且重寫我們需要使用的那幾個(gè)方法即可。
/* 接口A*/
public?interface?A {
????????void?methodA();
????????void?methodB();
????????void?methodC();
????????void?methodD();
????????void?methodE();
????????void?methodF();
}
/* 適配器類 */
public?abstract?class?Adapter implements?A {
????????public?void?methodA() {}
????????public?void?methodB() {}
????????public?void?methodC() {}
????????public?void?methodD() {}
????????public?void?methodE() {}
????????public?void?methodF() {}
}
/* 實(shí)現(xiàn)類 */
public?class?Aimplement extends?Adapter {
??????public?void?methodA(){
????????System.out.println("實(shí)現(xiàn)A方法被調(diào)用");
??????}
??????public?void?methodB(){
????????System.out.println("實(shí)現(xiàn)b方法被調(diào)用");
??????}
}
/*測(cè)試類*/
public?class?Test {
????public?static?void?main(String[] args) {
????????A a = new Aimplement();
????????a.methodA();
????????a.methodB();
????}
}
所謂“實(shí)踐出真知”,只有理論結(jié)合實(shí)踐,才能在面臨挑戰(zhàn)時(shí),細(xì)心十足地運(yùn)用設(shè)計(jì)模式。