適配器模式——七種結(jié)構(gòu)型模式之一

1.前言


其它的設(shè)計(jì)模式可能經(jīng)常用但卻不知道名字,但這篇文章所講的是那種,哪怕不知道原理也肯定聽過(guò)名字的模式咖杂。適配器對(duì)于安卓開發(fā)人員來(lái)說(shuō),是個(gè)耳熟能詳?shù)慕M件蜘犁。只要使用列表控件翰苫,必然會(huì)用到它來(lái)連接視圖和數(shù)據(jù)。大家都知道這兩者分屬View層和Model層这橙,通過(guò)接口與外部保持通信奏窑。若類型差距甚遠(yuǎn)的它們想要交互:

  • 第一種方法就是改變各自的接口。先不說(shuō)View層基本由SDK提供API而不是源碼屈扎,就算Model層支持修改埃唯,但當(dāng)初定義接口是為了通用性,怎么可能一個(gè)應(yīng)用修改一次鹰晨。
  • 第二種方法便是提供一個(gè)中間類墨叛,分別與兩個(gè)接口對(duì)接,起到轉(zhuǎn)換器的作用模蜡。就像不同齒距的齒輪漠趁,中間再加一個(gè)齒輪,就能協(xié)同工作了忍疾。

2.概念


適配器模式把一個(gè)類的接口變換成客戶端所期待的另一種接口闯传,從而使原本因接口不匹配而無(wú)法在一起工作的兩個(gè)類能夠在一起工作。通過(guò)學(xué)習(xí)《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》卤妒,知道以下兩種情況可以使用:

  • 系統(tǒng)需使用現(xiàn)有的類甥绿,而此類的接口不符合要求,即接口不兼容则披;
  • 想要建立一個(gè)可以重復(fù)使用的類(統(tǒng)一的輸出接口)共缕,用來(lái)與沒太大關(guān)聯(lián)且可能不斷引進(jìn)的類(輸入端的類型不可預(yù)知)一起工作,典型是列表的適配器士复。

3.場(chǎng)景


有一個(gè)人想喝酒图谷,他種了滿園的葡萄。雖然收獲到了葡萄但是自己不會(huì)釀酒判没,仍然喝不到酒蜓萄。后來(lái)附近開了酒廠,他把葡萄送過(guò)去加工澄峰,換來(lái)了等價(jià)的紅酒嫉沽。其中,酒廠就相當(dāng)于是適配器俏竞。

4.寫法


// 目標(biāo)或輸出接口
public interface Man {
    void drink();
}
// 提供源接口或輸入端類型
public class Vineyard {
    public String provide() {
        return "葡萄";
    }
}
// 適配器提供接口轉(zhuǎn)換
public class Winery extends Vineyard implements Man {
    @Override
    public void drink() {
        switch (provide()) {
            case "葡萄":
                System.out.println("我喝到了紅酒");
                break;
            default:
                System.out.println("我啥也沒喝到");
        }
    }
}
public class Main {
    public static void main(String[] args) {
        // 通過(guò)新建的酒廠喝到酒
        new Winery().drink();
    }
}

上面的代碼展示的是類適配器模式绸硕,即適配器類通過(guò)繼承源接口的實(shí)現(xiàn)類和實(shí)現(xiàn)目標(biāo)接口堂竟,來(lái)獲取輸入和輸出,并在內(nèi)部完成轉(zhuǎn)換玻佩。由于Java不支持多繼承出嘹,所以目標(biāo)接口不能用類替換。

通過(guò)前面的學(xué)習(xí)咬崔,知道可以用代理模式替換繼承關(guān)系税稼,即通過(guò)持有的對(duì)象來(lái)實(shí)現(xiàn)自己的行為。在保證邏輯的情況下垮斯,還能增加結(jié)構(gòu)的靈活性郎仆,同時(shí)避免了多繼承,允許目標(biāo)接口用類替換兜蠕,這便是對(duì)象適配器模式扰肌。

public class Winery implements Man {

    // 持有源接口的對(duì)象
    private Vineyard vineyard;

    public Winery(Vineyard vineyard) {
        this.vineyard = vineyard;
    }

    @Override
    public void drink() {
        switch (vineyard.provide()) {
            case "葡萄":
                System.out.println("我喝到了紅酒");
                break;
            default:
                System.out.println("我啥也沒喝到");
        }
    }
}
public class Main {
    public static void main(String[] args) {
        // 通過(guò)新建的酒廠喝到酒
        new Winery(new Vineyard()).drink();
    }
}

這么改后,還發(fā)現(xiàn)了另一個(gè)好處熊杨。源接口中的方法不會(huì)暴露出來(lái)曙旭,即相比類適配器模式,適配器中少了繼承源接口后引入的多余方法晶府,降低用戶學(xué)習(xí)成本桂躏。

5.總結(jié)


在使用適配器模式時(shí),本著多用合成或聚合川陆,少用繼承的原則沼头。對(duì)于列表控件的適配器,即使子項(xiàng)View各種各樣书劝,它只要知道返回的是View類型即可,讓用戶來(lái)處理解析數(shù)據(jù)土至、綁定展示控件等操作购对。達(dá)到隔離變化、擁抱變化的目的陶因,也提高了代碼的復(fù)用性和擴(kuò)展性骡苞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市楷扬,隨后出現(xiàn)的幾起案子解幽,更是在濱河造成了極大的恐慌,老刑警劉巖烘苹,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躲株,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡镣衡,警方通過(guò)查閱死者的電腦和手機(jī)霜定,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門档悠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人望浩,你說(shuō)我怎么就攤上這事辖所。” “怎么了磨德?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵缘回,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我典挑,道長(zhǎng)酥宴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任搔弄,我火速辦了婚禮幅虑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顾犹。我一直安慰自己倒庵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布炫刷。 她就那樣靜靜地躺著擎宝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浑玛。 梳的紋絲不亂的頭發(fā)上绍申,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音顾彰,去河邊找鬼极阅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涨享,可吹牛的內(nèi)容都是我干的筋搏。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼厕隧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奔脐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吁讨,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤髓迎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后建丧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體排龄,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年茶鹃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涣雕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艰亮。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挣郭,靈堂內(nèi)的尸體忽然破棺而出迄埃,到底是詐尸還是另有隱情,我是刑警寧澤兑障,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布侄非,位于F島的核電站,受9級(jí)特大地震影響流译,放射性物質(zhì)發(fā)生泄漏逞怨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一福澡、第九天 我趴在偏房一處隱蔽的房頂上張望叠赦。 院中可真熱鬧,春花似錦革砸、人聲如沸除秀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)册踩。三九已至,卻和暖如春效拭,著一層夾襖步出監(jiān)牢的瞬間暂吉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工缎患, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慕的,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓挤渔,卻偏偏與公主長(zhǎng)得像业稼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚂蕴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

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