設(shè)計模式——適配器設(shè)計模式

現(xiàn)實生活中的適配器例子:

image.png

一 基本介紹

  1. 適配器模式(Adapter Pattern)將某個類的接口轉(zhuǎn)換成客戶端期望的另一個接口表示,主的目的是兼容性,讓原本因接口不匹配不能一起工作的兩個類可以協(xié)同工作。其別名為包裝器(Wrapper)

  2. 適配器模式屬于結(jié)構(gòu)型模式

  3. 主要分為三類:類適配器模式、對象適配器模式、接口適配器模式

二 工作原理

  1. 適配器模式:將一個類的接口轉(zhuǎn)換成另一種接口.讓原本接口不兼容的類可以兼容

  2. 從用戶的角度看不到被適配者,是解耦的

  3. 用戶調(diào)用適配器轉(zhuǎn)化出來的目標接口方法,適配器再調(diào)用被適配者的相關(guān)接口方法

  4. 用戶收到反饋結(jié)果,感覺只是和目標接口交互,如圖

image.png

三 類適配器模式

3.1 類適配器模式介紹

基本介紹:Adapter 類,通過繼承 src 類,實現(xiàn) dst 類接口,完成 src->dst 的適配。

3.2 類適配器模式應(yīng)用實例

  1. 應(yīng)用實例說明

以生活中充電器的例子來講解適配器,充電器本身相當于 Adapter,220V 交流電相當于 src (即被適配者),我們的目 dst(即 目標)是 5V 直流電

  1. 思路分析(類圖)
image.png
  1. 代碼實現(xiàn)
public class Client {
    public static void main(String[] args){
        System.out.println(" === 類適配器模式 ====");
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter ());
    }
}

適配器接口:

public interface IVoltage5V {
    public int output5V();
}

充電:

public class Phone {
    public void charging(IVoltage5V iVoltage5V) {
        if (iVoltage5V.output5V() == 5) {
            System.out.println("電壓為 5V, 可以充電~~");
        } else if (iVoltage5V.output5V() > 5) {
            System.out.println("電壓大于 5V, 不能充電~~");
        }
    }
}

被適配的類:

public class Voltage220V {
    //輸出 220V 的電壓
    public int output220V() { int src = 220;
        System.out.println("電壓=" + src + "伏");
        return src;
    }
}

適配器類:

public class VoltageAdapter extends Voltage220V implements IVoltage5V  {
    @Override
    public int output5V() {
        //獲取到 220V 電壓
        int srcV = output220V();
        int dstV = srcV / 44 ; //轉(zhuǎn)成 5v
        return dstV;
    }
}
image.png
  1. 類適配器模式注意事項和細節(jié)
  1. Java 是單繼承機制,所以類適配器需要繼承 src 類這一點算是一個缺點, 因為這要求 dst 必須是接口,有一定局限性;
  2. src 類的方法在 Adapter 中都會暴露出來,也增加了使用的成本。
  3. 由于其繼承了 src 類,所以它可以根據(jù)需求重寫 src 類的方法,使得 Adapter 的靈活性增強了。

四 對象適配器模式

4.1 對象適配器模式介紹

  1. 基本思路和類的適配器模式相同,只是將 Adapter 類作修改,不是繼承 src 類,而是持有 src 類的實例,以解決兼容性的問題。 即:持有 src 類,實現(xiàn) dst 類接口,完成 src->dst 的適配

  2. 根據(jù)“合成復(fù)用原則”,在系統(tǒng)中盡量使用關(guān)聯(lián)關(guān)系(聚合)來替代繼承關(guān)系。

  3. 對象適配器模式是適配器模式常用的一種

4.2 對象適配器模式應(yīng)用實例

  1. 應(yīng)用實例說明
    以生活中充電器的例子來講解適配器,充電器本身相當于 Adapter,220V 交流電相當于 src (即被適配者),我們的目 dst(即目標)是 5V 直流電,使用對象適配器模式完成。
  2. 思路分析(類圖):只需修改適配器即可, 如下:
image.png

代碼實現(xiàn):

public class VoltageAdapter implements IVoltage5V {
    private Voltage220V voltage220V; // 關(guān)聯(lián)關(guān)系-聚合

    //通過構(gòu)造器,傳入一個 Voltage220V 實例
    public VoltageAdapter(Voltage220V voltage220v) {
        this.voltage220V = voltage220v;
    }

    @Override
    public int output5V() {
        int dst = 0;
        if(null != voltage220V) {
            int src = voltage220V.output220V();//獲取 220V 電壓
            System.out.println("使用對象適配器,進行適配~~");
            dst = src / 44;
            System.out.println("適配完成,輸出的電壓為=" + dst);
        }
        return dst;
    }
}

4.3 對象適配器模式注意事項和細節(jié)

  1. 對象適配器和類適配器其實算是同一種思想,只不過實現(xiàn)方式不同。
    根據(jù)合成復(fù)用原則,使用組合替代繼承, 所以它解決了類適配器必須繼承 src 的局限性問題,也不再要求 dst
    必須是接口。

  2. 使用成本更低,更靈活。

五. 接口適配器模式

5.1 接口適配器模式介紹

  1. 核心思路:當不需要全部實現(xiàn)接口提供的方法時,可先設(shè)計一個抽象類實現(xiàn)接口,并為該接口中每個方法提供一個默認實現(xiàn)(空方法),那么該抽象類的子類可有選擇地覆蓋父類的某些方法來實現(xiàn)需求

  2. 適用于一個接口不想使用其所有的方法的情況。

  1. 案例說明


    image.png

    代碼展示:

public interface Interface4 {
     public void m1();
     public void m2();
     public void m3();
     public void m4();
}
public abstract class AbsAdapter  implements Interface4 {
    //默認實現(xiàn)
    public void m1() {
    }

    public void m2() {
    }

    public void m3() {
    }

    public void m4() {
    }

}
public class Client {
    public static void main(String[] args) {
        AbsAdapter absAdapter = new AbsAdapter() {
            //只需要去覆蓋我們 需要使用 接口方法
            @Override
            public void m1() {
                System.out.println("使用了 m1 的方法");
            }
        };
        absAdapter.m1();
    }
}

六.適配器模式的注意事項和細節(jié)

  1. 三種命名方式,是根據(jù) src 是以怎樣的形式給到 Adapter(在 Adapter 里的形式)來命名的。
  2. 類適配器:以類給到,在 Adapter 里,就是將 src 當做類,繼承
    對象適配器:以對象給到,在 Adapter 里,將 src 作為一個對象,持有接口適配器:以接口給到,在 Adapter 里,將 src 作為一個接口,實現(xiàn)
  3. Adapter 模式最大的作用還是將原本不兼容的接口融合在一起工作。
  4. 實際開發(fā)中,實現(xiàn)起來不拘泥于我們講解的三種經(jīng)典形式

七. 適配器模式應(yīng)用場景

SpringMvc 中的 HandlerAdapter, 就使用了適配器模式

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

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

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

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

接口適配器使用場景:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

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