適配器模式

  適配器就是一種適配中間件,它存在于不匹配的二者之間,用于連接二者,將不匹配變得匹配,簡單點理解就是平常所見的轉(zhuǎn)接頭,轉(zhuǎn)換器之類的存在。

  適配器模式有兩種:類適配器、對象適配器、接口適配器

  前二者在實現(xiàn)上有些許區(qū)別,作用一樣,第三個接口適配器差別較大。

1、類適配器模式:

  原理:通過繼承來實現(xiàn)適配器功能。

  當(dāng)我們要訪問的接口A中沒有我們想要的方法 ,卻在另一個接口B中發(fā)現(xiàn)了合適的方法,我們又不能改變訪問接口A,在這種情況下,我們可以定義一個適配器p來進行中轉(zhuǎn),這個適配器p要實現(xiàn)我們訪問的接口A,這樣我們就能繼續(xù)訪問當(dāng)前接口A中的方法(雖然它目前不是我們的菜),然后再繼承接口B的實現(xiàn)類BB,這樣我們可以在適配器P中訪問接口B的方法了,這時我們在適配器P中的接口A方法中直接引用BB中的合適方法,這樣就完成了一個簡單的類適配器。

  詳見下方實例:我們以ps2與usb的轉(zhuǎn)接為例

ps2接口:Ps2

1publicinterface Ps2 {2void isPs2();3}

USB接口:Usb

1publicinterface Usb {2void isUsb();3}

USB接口實現(xiàn)類:Usber

1publicclassUsberimplements Usb {23? ? @Override4publicvoid isUsb() {5System.out.println("USB口");6? ? }78}

適配器:Adapter

1publicclassAdapterextendsUsberimplements Ps2 {23? ? @Override4publicvoid isPs2() {5? ? ? ? isUsb();6? ? }78}

測試方法:Clienter

1publicclass Clienter {23publicstaticvoid main(String[] args) {4Ps2 p =new Adapter();5? ? ? ? p.isPs2();6? ? }78}

顯示結(jié)果:

USB口

實例講解:

  我手中有個ps2插頭的設(shè)備,但是主機上只有usb插頭的插口,怎么辦呢?弄個轉(zhuǎn)換器,將ps2插頭轉(zhuǎn)換成為USB插頭就可以使用了。

  接口Ps2:描述ps2接口格式

  接口Usb:描述USB接口格式

  類Usber:是接口Usb的實現(xiàn)類,是具體的USB接口格式

  Adapter:用于將ps2接口格式轉(zhuǎn)換成為USB接口格式

2、對象適配器模式

  原理:通過組合來實現(xiàn)適配器功能。

  當(dāng)我們要訪問的接口A中沒有我們想要的方法 ,卻在另一個接口B中發(fā)現(xiàn)了合適的方法,我們又不能改變訪問接口A,在這種情況下,我們可以定義一個適配器p來進行中轉(zhuǎn),這個適配器p要實現(xiàn)我們訪問的接口A,這樣我們就能繼續(xù)訪問當(dāng)前接口A中的方法(雖然它目前不是我們的菜),然后在適配器P中定義私有變量C(對象)(B接口指向變量名),再定義一個帶參數(shù)的構(gòu)造器用來為對象C賦值,再在A接口的方法實現(xiàn)中使用對象C調(diào)用其來源于B接口的方法。

  詳見下方實例:我們?nèi)匀灰詐s2與usb的轉(zhuǎn)接為例

ps2接口:Ps2

1publicinterface Ps2 {2void isPs2();3}

USB接口:Usb

1publicinterface Usb {2void isUsb();3}

USB接口實現(xiàn)類:Usber

1publicclassUsberimplements Usb {23? ? @Override4publicvoid isUsb() {5System.out.println("USB口");6? ? }78}

適配器:Adapter

1publicclassAdapterimplements Ps2 { 2 3private Usb usb; 4public Adapter(Usb usb){ 5this.usb = usb; 6? ? } 7? ? @Override 8publicvoid isPs2() { 9? ? ? ? usb.isUsb();10? ? }1112}

測試類:Clienter

1publicclass Clienter {23publicstaticvoid main(String[] args) {4Ps2 p =newAdapter(new Usber());5? ? ? ? p.isPs2();6? ? }78}

結(jié)果顯示:

USB口

實例講解:

  我手中有個ps2插頭的設(shè)備,但是主機上只有usb插頭的插口,怎么辦呢?弄個轉(zhuǎn)換器,將ps2插頭轉(zhuǎn)換成為USB插頭就可以使用了。

  接口Ps2:描述ps2接口格式

  接口Usb:描述USB接口格式

  類Usber:是接口Usb的實現(xiàn)類,是具體的USB接口格式

  Adapter:用于將ps2接口格式轉(zhuǎn)換成為USB接口格式

3、接口適配器模式

  原理:通過抽象類來實現(xiàn)適配,這種適配稍別于上面所述的適配。

  當(dāng)存在這樣一個接口,其中定義了N多的方法,而我們現(xiàn)在卻只想使用其中的一個到幾個方法,如果我們直接實現(xiàn)接口,那么我們要對所有的方法進行實現(xiàn),哪怕我們僅僅是對不需要的方法進行置空(只寫一對大括號,不做具體方法實現(xiàn))也會導(dǎo)致這個類變得臃腫,調(diào)用也不方便,這時我們可以使用一個抽象類作為中間件,即適配器,用這個抽象類實現(xiàn)接口,而在抽象類中所有的方法都進行置空,那么我們在創(chuàng)建抽象類的繼承類,而且重寫我們需要使用的那幾個方法即可。

目標(biāo)接口:A

1publicinterface A {2void a();3void b();4void c();5void d();6void e();7void f();8}

適配器:Adapter

1publicabstractclassAdapterimplements A {2publicvoid a(){}3publicvoid b(){}4publicvoid c(){}5publicvoid d(){}6publicvoid e(){}7publicvoid f(){}8}

實現(xiàn)類:Ashili

1publicclassAshiliextends Adapter {2publicvoid a(){3System.out.println("實現(xiàn)A方法被調(diào)用");4? ? }5publicvoid d(){6System.out.println("實現(xiàn)d方法被調(diào)用");7? ? }8}

測試類:Clienter

1publicclass Clienter {23publicstaticvoid main(String[] args) {4A a =new Ashili();5? ? ? ? a.a();6? ? ? ? a.d();7? ? }89}

4、適配器模式應(yīng)用場景

類適配器與對象適配器的使用場景一致,僅僅是實現(xiàn)手段稍有區(qū)別,二者主要用于如下場景:

 ?。?)想要使用一個已經(jīng)存在的類,但是它卻不符合現(xiàn)有的接口規(guī)范,導(dǎo)致無法直接去訪問,這時創(chuàng)建一個適配器就能間接去訪問這個類中的方法。

  (2)我們有一個類,想將其設(shè)計為可重用的類(可被多處訪問),我們可以創(chuàng)建適配器來將這個類來適配其他沒有提供合適接口的類。

  以上兩個場景其實就是從兩個角度來描述一類問題,那就是要訪問的方法不在合適的接口里,一個從接口出發(fā)(被訪問),一個從訪問出發(fā)(主動訪問)。

接口適配器使用場景:

 ?。?)想要使用接口中的某個或某些方法,但是接口中有太多方法,我們要使用時必須實現(xiàn)接口并實現(xiàn)其中的所有方法,可以使用抽象類來實現(xiàn)接口,并不對方法進行實現(xiàn)(僅置空),然后我們再繼承這個抽象類來通過重寫想用的方法的方式來實現(xiàn)。這個抽象類就是適配器。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容