外觀模式——七種結(jié)構(gòu)型模式之一

1.前言


代理和裝飾模式都是對單個對象的封裝亮航,不熟悉的朋友可以到設(shè)計模式文集中查看一下将塑。若將這個對象擴展一下缀辩,讓它成為具有某種業(yè)務(wù)功能的模塊劲件,甚至系統(tǒng)畔规,會如何棠涮?對箫老,說到底昔榴,它仍是一個對象妓肢。不過這個對象在工作時捌省,內(nèi)部的子對象會相互調(diào)用,完成數(shù)據(jù)的傳遞碉钠,共同支持著整個大的對象纲缓。

2.概念


外觀模式要求一個子系統(tǒng)的外部與其內(nèi)部的通信必須通過一個統(tǒng)一的對象進行。目的很簡單喊废,就是為了對外隱藏子系統(tǒng)的具體實現(xiàn)祝高、隔離變化

因為子系統(tǒng)的功能可能一開始就比較復(fù)雜污筷,又或者隨著使用而變得復(fù)雜褂策。一旦復(fù)雜,根據(jù)單一職責原則颓屑,將拆分出更多斤寂、更小的類來負責其中的一個方面。對于使用者而言揪惦,必須了解到每個類的作用才能靈活使用遍搞,這無疑增加了學(xué)習(xí)的成本。所以直接提供子系統(tǒng)功能的調(diào)用器腋,拒絕對其內(nèi)部的訪問溪猿。

若系統(tǒng)具有層次結(jié)構(gòu)钩杰,那么每一層都相當于是子系統(tǒng),并且之間相互依賴诊县。當某一層需要改變或替換時讲弄,將會影響到相關(guān)的層級,這無疑增加了維護的難度依痊”艹可在每層的入口提供調(diào)用的抽象,將依賴關(guān)系進行隔離胸嘁。

3.場景


現(xiàn)在的汽車是個很復(fù)雜的系統(tǒng)瓶摆,由不少小的子系統(tǒng)組成,其中動力系統(tǒng)包含發(fā)動機性宏,運行系統(tǒng)包含輪胎群井。但作為司機,若想開動汽車毫胜,不需要知道如何啟動發(fā)動機书斜,再將動力傳輸給輪胎,這一切相應(yīng)的系統(tǒng)內(nèi)部會處理酵使。若想更換不同類型的輪胎菩佑,也不需要改造汽車,它們之間不是直接相連凝化,而是通過標準的軸承相連稍坯。

4.寫法


子系統(tǒng)內(nèi)部各層級間調(diào)用的抽象,以及對應(yīng)的具體實現(xiàn)搓劫。

public interface Engine {
    void startUp();
}

public class Benz implements Engine {
    @Override
    public void startUp() {
        System.out.println("發(fā)動奔馳引擎");
    }
}
public interface Tyre {
    void roll();
}

public class Giti implements Tyre {
    @Override
    public void roll() {
        System.out.println("使用佳通輪胎");
    }
}

public class Michelin implements Tyre {
    @Override
    public void roll() {
        System.out.println("使用米其林輪胎");
    }
}

任何一個系統(tǒng)相對于使用者所在的系統(tǒng)瞧哟,也是個子系統(tǒng),它與內(nèi)部系統(tǒng)的關(guān)系是具有層級的枪向。通過抽象的接口調(diào)用勤揩,可以增加維護的靈活性,減少對自己的影響秘蛔。

// 1.聲明(子)系統(tǒng)對外的對象
public class Car {

    // 2.列出包含的子系統(tǒng)
    private Engine mEngine;
    private Tyre mTyre;

    public Car(Engine engine, Tyre tyre) {
        mEngine = engine;
        mTyre = tyre;
    }

    // 3.設(shè)置子系統(tǒng)的變化
    public void setmTyre(Tyre tyre) {
        mTyre = tyre;
    }

    // 4.對外展示功能的調(diào)用
    public void drive() {
        startUp();
        roll();
    }

    // 5.內(nèi)部具體實現(xiàn)
    private void startUp() {
        mEngine.startUp();
    }

    private void roll() {
        mTyre.roll();
    }
}

提供一個統(tǒng)一的高層接口陨亡,使功能的調(diào)用簡單明確,降低用戶使用成本深员,也對用戶屏蔽許多不需要知道的細節(jié)负蠕。

public class Client {
    public static void main(String[] args) {
        // 1.創(chuàng)建子系統(tǒng)實例
        Car mCar = new Car(new Benz(), new Giti());
        // 2.調(diào)用對外功能接口
        mCar.drive();
        // 3.子系統(tǒng)內(nèi)部改變
        mCar.setmTyre(new Michelin());
        mCar.drive();
    }
}

5.總結(jié)


外觀模式就是最常用的封裝,將完整的倦畅、復(fù)雜的功能作為一個對象封裝起來遮糖。由于用戶不知道細節(jié),降低了使用的耦合度叠赐;又將復(fù)雜的功能邏輯放在內(nèi)部欲账,降低了使用的難度屡江。可能的缺點便是赛不,通過接口降低內(nèi)部邏輯的耦合惩嘉,便于維護的同時,增加了過多的代碼踢故。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末文黎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子畴椰,更是在濱河造成了極大的恐慌,老刑警劉巖鸽粉,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斜脂,死亡現(xiàn)場離奇詭異,居然都是意外死亡触机,警方通過查閱死者的電腦和手機帚戳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儡首,“玉大人片任,你說我怎么就攤上這事∈呖瑁” “怎么了对供?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氛濒。 經(jīng)常有香客問我产场,道長,這世上最難降的妖魔是什么舞竿? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任京景,我火速辦了婚禮,結(jié)果婚禮上骗奖,老公的妹妹穿的比我還像新娘确徙。我一直安慰自己,他們只是感情好执桌,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布鄙皇。 她就那樣靜靜地躺著,像睡著了一般仰挣。 火紅的嫁衣襯著肌膚如雪育苟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天椎木,我揣著相機與錄音违柏,去河邊找鬼博烂。 笑死,一個胖子當著我的面吹牛漱竖,可吹牛的內(nèi)容都是我干的禽篱。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼馍惹,長吁一口氣:“原來是場噩夢啊……” “哼躺率!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起万矾,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤悼吱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后良狈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體后添,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年薪丁,在試婚紗的時候發(fā)現(xiàn)自己被綠了遇西。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡严嗜,死狀恐怖粱檀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漫玄,我是刑警寧澤茄蚯,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站睦优,受9級特大地震影響第队,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刨秆,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一凳谦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衡未,春花似錦尸执、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至送粱,卻和暖如春褪贵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工脆丁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留世舰,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓槽卫,卻偏偏與公主長得像跟压,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歼培,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

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