【設(shè)計模式(10)】結(jié)構(gòu)型模式之外觀模式

個人學習筆記分享浑玛,當前能力有限顾彰,請勿貶低胃碾,菜鳥互學,大佬繞道

如有勘誤厕隧,歡迎指出和討論,本文后期也會進行修正和補充


前言

生活中吁讨,如果有什么事需要去營業(yè)廳等站點辦理,我們希望的是給接待員需要的信息排龄,然后他們?nèi)マk理完成翎朱,走人!

然而有些時候拴曲,我們得到的回應(yīng)是我們需要先做什么,再做什么兑障,再去哪做什么blablabla....

后者一看就不專業(yè)是不是蕉汪?做個事你們做不就得了嗎,不然我來營業(yè)廳干嘛福澡?掏出手機百度一下不就得了?

作為專業(yè)的程序猿革砸,那我們寫的代碼肯定得專業(yè)一些糯累。

對于一個系統(tǒng),我們隱藏其內(nèi)部細節(jié)效拭,并向外部提供訪問接口胖秒,進而達到隱藏復雜性的目的。

說白了阎肝,客戶告訴我們有啥事,我們內(nèi)部辦好判导,至于細節(jié)不需要告知客戶,保證事情辦好就成骡楼。


外觀(Facade)模式又叫作門面模式,是一種通過為多個復雜的子系統(tǒng)提供一個一致的接口引镊,而使這些子系統(tǒng)更加容易被訪問的模式。

該模式對外有一個統(tǒng)一接口弟头,外部應(yīng)用程序不用關(guān)心內(nèi)部子系統(tǒng)的具體細節(jié)赴恨,這樣會大大降低應(yīng)用程序的復雜度伴栓,提高了程序的可維護性。

其實我們一直都在有意無意的大量使用外觀模式——高層模塊需要調(diào)度多個子系統(tǒng)時钳垮,定義一個新的類封裝這些子系統(tǒng),并向外提供精簡的接口以供訪問歧焦。


1.介紹

使用目的:為子系統(tǒng)中的一組接口提供一個一致的界面肚医,外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用舰涌。

使用時機:定義整個系統(tǒng)的入口你稚,而客戶端并不需要知道系統(tǒng)內(nèi)部的復雜聯(lián)系,僅需要一個“接待者”即可

解決問題:降低訪問復雜系統(tǒng)的內(nèi)部子系統(tǒng)時的復雜度入宦,簡化客戶端與之的接口

實現(xiàn)方法:定義一個類乾闰,封裝子系統(tǒng)涯肩,并向客戶端提供一個接口以供訪問

應(yīng)用實例

  • MVC中的view-controller-service-dao層次結(jié)構(gòu)轿钠,高層系統(tǒng)都只知道下一層系統(tǒng)的接口疗垛,并不知道其細節(jié)及其子系統(tǒng)
  • 第三方sdk或者庫通常都會提供統(tǒng)一的接口硫朦,并不會暴露內(nèi)部的邏輯細節(jié)

優(yōu)點

  • 減少系統(tǒng)相互依賴,降低耦合度咬展,提高靈活性
  • 隱藏系統(tǒng)內(nèi)部細節(jié),減少了客戶需要處理的信息破婆,使得子系統(tǒng)的使用更加方便
  • 外部不知道系統(tǒng)的內(nèi)部細節(jié),因此也就更加安全

缺點:增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼瀑梗,繼承重寫都不合適裳扯,違背了“開閉原則”


2.結(jié)構(gòu)

通常包括三個角色

  • 外觀(Facade)角色:為多個子系統(tǒng)對外提供一個共同的接口。
  • 子系統(tǒng)(Sub System)角色:實現(xiàn)系統(tǒng)的部分功能铺纽,客戶可以通過外觀角色訪問它哟忍。
  • 客戶(Client)角色:通過一個外觀角色訪問其提供的子系統(tǒng)功能锅很。
image-20201026153200057
  • 客戶端(Client)調(diào)用Facade中的接口
  • Facade持有多個SubSystem對象,通過調(diào)用其方法叛复,提供接口給外部使用
  • Client并不需要訪問多個SubSystem扔仓,而是通過Facede作為中間人,即可使用多個SubSystem的功能


3.實現(xiàn)

  1. 定義子系統(tǒng)角色

    class SubSystemA {
        public void doA() {
            System.out.println("子系統(tǒng)A被調(diào)用");
        }
    }
    
    class SubSystemB {
        public void doB() {
            System.out.println("子系統(tǒng)B被調(diào)用");
        }
    }
    
  2. 定義外觀角色

    class Facade {
        private SubSystemA subSystemA;
        private SubSystemB subSystemB;
    
        public Facade() {
            this.subSystemA = new SubSystemA();
            this.subSystemB = new SubSystemB();
        }
    
        public void doA() {
            subSystemA.doA();
        }
    
        public void doB() {
            subSystemB.doB();
        }
    }
    
  3. 測試客戶端

    public class FacadeTest {
        public static void main(String[] args) {
            Facade facade = new Facade();
            facade.doA();
            facade.doB();
        }
    }
    

完整代碼

package com.company.test.facade;

class SubSystemA {
    public void doA() {
        System.out.println("子系統(tǒng)A被調(diào)用");
    }
}

class SubSystemB {
    public void doB() {
        System.out.println("子系統(tǒng)B被調(diào)用");
    }
}

class Facade {
    private SubSystemA subSystemA;
    private SubSystemB subSystemB;

    public Facade() {
        this.subSystemA = new SubSystemA();
        this.subSystemB = new SubSystemB();
    }

    public void doA() {
        subSystemA.doA();
    }

    public void doB() {
        subSystemB.doB();
    }
}

public class FacadeTest {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.doA();
        facade.doB();
    }
}

運行結(jié)果

image-20201026154148589

后記

想了想確實沒啥好說的,作為后端程序猿mvcview-controller-serivce-dao模式再熟悉不過了呜笑,應(yīng)該早已養(yǎng)成了這種模式的習慣

其實也是Java的核心思想之一,即封裝叫胁。將方法封裝起來并隱藏細節(jié),只提供給外部接口以便使用微谓。


作者:Echo_Ye

WX:Echo_YeZ

Email :echo_yezi@qq.com

個人站點:在搭了在搭了谤民。。触创。(右鍵 - 新建文件夾)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哼绑,一起剝皮案震驚了整個濱河市碉咆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疫铜,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件席揽,死亡現(xiàn)場離奇詭異谓厘,居然都是意外死亡,警方通過查閱死者的電腦和手機属桦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門聂宾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人系谐,你說我怎么就攤上這事盏混。” “怎么了止喷?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵混聊,是天一觀的道長。 經(jīng)常有香客問我预愤,道長咳胃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任销睁,我火速辦了婚禮存崖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冗栗。我一直安慰自己隅居,他們只是感情好趁曼,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乒融,像睡著了一般摄悯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奢驯,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天撒遣,我揣著相機與錄音,去河邊找鬼义黎。 笑死,一個胖子當著我的面吹牛泻云,可吹牛的內(nèi)容都是我干的狐蜕。 我是一名探鬼主播宠纯,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼层释!你這毒婦竟也來了婆瓜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤贡羔,失蹤者是張志新(化名)和其女友劉穎勃救,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體治力,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蒙秒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宵统。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晕讲。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖马澈,靈堂內(nèi)的尸體忽然破棺而出瓢省,到底是詐尸還是另有隱情痊班,我是刑警寧澤馒胆,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布祝迂,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏沿量。R本人自食惡果不足惜欧瘪,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一妖碉、第九天 我趴在偏房一處隱蔽的房頂上張望坐榆。 院中可真熱鬧席镀,春花似錦豪诲、人聲如沸屎篱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隧土。三九已至次洼,卻和暖如春卖毁,著一層夾襖步出監(jiān)牢的瞬間炭剪,已是汗流浹背翔脱。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疚沐,地道東北人亮蛔。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓辣吃,卻偏偏與公主長得像神得,于是被迫代替她去往敵國和親循头。 傳聞我的和親對象是個殘疾皇子卡骂,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351