Java設(shè)計(jì)模式--適配器模式

適配器模式的官方定義是:適配器模式把一個(gè)類的接口變換成客戶端所期待的另一種接口捎拯,從而使原本因接口不匹配而無法在一起工作的兩個(gè)類能夠在一起工作给僵。

舉例說明:很多的插座都是兩孔的,但是你的臺(tái)燈的電源線卻有三個(gè)腳鹃骂,這樣你無法直接將臺(tái)燈直接使用,要想三腳的電源線插到兩孔的插座上你需要買一個(gè)(三腳-兩孔)的轉(zhuǎn)換器來將它們適配起來滨嘱,而這個(gè)轉(zhuǎn)換器我們稱之為適配器冈涧。
適配器模式分為3類:類的適配器模式碰煌、對(duì)象的適配器模式、接口的適配器模式撼港。

1.類的適配器模式:

你有一個(gè)源類坪它,他有一個(gè)method1()方法,如下

public class source{
    public void method1(){
        System.out.println("this is method1");
    }
}

但是你的客戶期望的接口并不是這個(gè)源類這樣的帝牡,他不僅僅需要有method1方法還需要有method2方法往毡。如下:

public interface targrt{
    public void method1();
    public void method2();
}

此時(shí),要想滿足目標(biāo)接口你需要?jiǎng)?chuàng)建一個(gè)適配器靶溜,它既有source的method1方法還有類interface的method方法开瞭,如下:

class adapter extends source implements targrt{
    /*
     * method1方法可以直接從source繼承過來
     * 自己實(shí)現(xiàn)接口中的method2方法
     */
    @Override
    public void method2() {
        System.out.println("this is method2");
    }
}

但是這樣做是有一個(gè)大問題就是當(dāng)Source類有兩個(gè)時(shí),由于Java時(shí)單繼承的罩息,無法通過類適配器模式來完成嗤详。如:

public class source1{
    public void method3(){
        System.out.println("this is method3");
    }
}

2.對(duì)象適配器模式

對(duì)象適配器模式跟類適配其模式相比僅僅是改變了Adapter類。如下:

class adapter implements targrt{
        private Source source;
        private Source1 source1;
    
    public Adapter(Source source,Source1 source1){
        this.source = source;
        this.source1 = souce1;
        }
    public void method1(){
        this.source.method1();
    }
     public void method3(){
        this.source1.method3();
    }
    /*
     * 自己實(shí)現(xiàn)接口中的method2方法
     */
    @Override
    public void method2() {
        System.out.println("this is method2");
    }
}

對(duì)象適配器模式是將源方法的實(shí)現(xiàn)通過持有一個(gè)源實(shí)例的形式瓷炮,這樣當(dāng)有多個(gè)source類時(shí)可以通過持有多個(gè)實(shí)例來實(shí)現(xiàn)葱色,解決了類適配其模式的問題。

3.缺省適配模式

缺省適配(Default Adapter)模式為一個(gè)接口提供缺省實(shí)現(xiàn)娘香,這樣子類型可以從這個(gè)缺省實(shí)現(xiàn)進(jìn)行擴(kuò)展苍狰,而不必從原有接口進(jìn)行擴(kuò)展办龄。

很多時(shí)候我們的寫的一個(gè)類需要繼承一個(gè)目標(biāo)接口,但是這個(gè)目標(biāo)接口有很多方法我們用不上淋昭,我們想只實(shí)現(xiàn)其中想要的方法時(shí)可以使用缺省適配器模式俐填。首先定義一個(gè)抽象類來繼承目標(biāo)接口,然后用自己的類去繼承這個(gè)抽象類的方式實(shí)現(xiàn)目標(biāo)接口响牛。如下:

/*
 *  目標(biāo)接口玷禽,其中我們只想要method1方法
 */
public interface Target{  
    public void method1();  
    public void method2();  
}  
public abstract class Adapter implements Target{  
      
    public void method1(){}  
    public void method2(){}  
} 

我們寫的類(只去實(shí)現(xiàn)method1方法):

public class MyClass extends Adapter{  
    public void method1(){
           System.out.println("this is method1");
     }  
}  

最后的Test類:

public class Test {
    public static void main(String[] args) {
        Target target = new MyClass();
    }
}

總結(jié):

類的適配器模式:當(dāng)希望將一個(gè)類轉(zhuǎn)換成滿足另一個(gè)新接口的類時(shí),可以使用類的適配器模式呀打,創(chuàng)建一個(gè)新類,繼承原有的類糯笙,實(shí)現(xiàn)新的接口即可贬丛。

對(duì)象的適配器模式:當(dāng)希望將一個(gè)對(duì)象轉(zhuǎn)換成滿足另一個(gè)新接口的對(duì)象時(shí),可以創(chuàng)建一個(gè)類给涕,持有原類的一個(gè)實(shí)例豺憔,在類的方法中,調(diào)用實(shí)例的方法就行够庙。

缺省適配器模式:當(dāng)不希望實(shí)現(xiàn)一個(gè)接口中所有的方法時(shí)恭应,可以創(chuàng)建一個(gè)抽象類,實(shí)現(xiàn)所有方法耘眨,我們寫別的類的時(shí)候昼榛,繼承抽象類即可。

適配器模式的缺點(diǎn):
  過多的使用適配器剔难,會(huì)讓系統(tǒng)非常零亂胆屿,不易整體進(jìn)行把握。比如偶宫,明明看到調(diào)用的是A接口非迹,其實(shí)內(nèi)部被適配成了B接口的實(shí)現(xiàn),一個(gè)系統(tǒng)如果太多出現(xiàn)這種情況纯趋,無異于一場(chǎng)災(zāi)難憎兽。因此如果不是很有必要,可以不使用適配器吵冒,而是直接對(duì)系統(tǒng)進(jìn)行重構(gòu)纯命。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桦锄,隨后出現(xiàn)的幾起案子扎附,更是在濱河造成了極大的恐慌,老刑警劉巖结耀,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件留夜,死亡現(xiàn)場(chǎng)離奇詭異匙铡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)碍粥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門鳖眼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嚼摩,你說我怎么就攤上這事钦讳。” “怎么了枕面?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵愿卒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我潮秘,道長(zhǎng)琼开,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任枕荞,我火速辦了婚禮柜候,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躏精。我一直安慰自己渣刷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布矗烛。 她就那樣靜靜地躺著辅柴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪高诺。 梳的紋絲不亂的頭發(fā)上碌识,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音虱而,去河邊找鬼筏餐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牡拇,可吹牛的內(nèi)容都是我干的魁瞪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惠呼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼导俘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起剔蹋,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤旅薄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體少梁,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洛口,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凯沪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片第焰。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妨马,靈堂內(nèi)的尸體忽然破棺而出挺举,到底是詐尸還是另有隱情,我是刑警寧澤烘跺,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布湘纵,位于F島的核電站,受9級(jí)特大地震影響滤淳,放射性物質(zhì)發(fā)生泄漏瞻佛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一娇钱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绊困,春花似錦文搂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至取视,卻和暖如春硝皂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背作谭。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工稽物, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人折欠。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓贝或,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锐秦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咪奖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 定義 適配器模式把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個(gè)類能夠在...
    步積閱讀 1,322評(píng)論 0 1
  • 一酱床、定義 共有兩類適配器模式 對(duì)象適配器模式在這種適配器模式中羊赵,適配器容納一個(gè)它包裹的類的實(shí)例。在這種情況下扇谣,適配...
    怡紅快綠閱讀 640評(píng)論 0 0
  • 適配器模式 什么是適配器模式呢昧捷?比如說客戶端中需要一個(gè)Sort() 函數(shù)闲昭,它可以實(shí)現(xiàn)簡(jiǎn)單的排序功能,但是這個(gè)時(shí)候料身,...
    ghwaphon閱讀 603評(píng)論 0 0
  • 適配器模式 1.定義: 適配器模式把一個(gè)類的接口轉(zhuǎn)換成客戶所期待的另一種接口汤纸,從而使原本因接口不匹配而無法工作在一...
    TangBuzhi閱讀 324評(píng)論 0 0
  • 當(dāng)主旋律足夠真誠(chéng),當(dāng)光偉正遠(yuǎn)離政治芹血,戰(zhàn)爭(zhēng)自有其大勢(shì)必然贮泞,當(dāng)煉獄已在而群魔如潮涌,悲天憫人的窩家祈禱再有用也不比“多...
    擱淺867閱讀 169評(píng)論 0 0