1. 程式人生 > >設計模式學習總結:外觀模式(Facade)

設計模式學習總結:外觀模式(Facade)

1.場景分析

如下圖所示,我們有一個家庭影院系統,其中包含了調音器、擴音器、播放器、劇場光、爆米花機等部分:
這裡寫圖片描述
然後我們模擬使用這個系統來播放一部電影,則我們需要進行一下操作:

//開啟爆米花機,開始爆米花
popper.on()
popper.pop()

//調燈光
lights.dim(10)

//把螢幕放下
screen.down()

//開啟投影機
projector.on()
projector.setInput(dvd)
projector.wideScreenMode()

//設定音效
amp.on()
amp.setDvd(dvd)
amp.setSurroundSound()
amp.setVolume
(5) //開啟DVD播放器播放電影 dvd.on() dvd.play()

然後看完電影后,我們還需要把它們依次關掉。
從上面我們可以看出,使用這些子系統是十分繁瑣的,這時我們就可以通過外觀模式(Facade)來為一個複雜的子系統提供一個更合理、更簡單易用的介面,如下


class HomeTheaterFacade
{
public:
    HomeTheaterFacade(Amplifier *amp, Tuner *tuner, CdPlayer *cd, DvdPlayer *dvd, Projector *projector, TheaterLights *lights
, Screen *screen, PopcornPopper *popper)
:_amp(amp), _tuner(tuner), _cd(cd), _dvd(dvd), _projector(projector), _lights(lights), _screen(screen), _popper(popper) { } void watchMovie(const string& movie) { _popper->on() _popper->pop() _lights->dim(10)
_screen->down() _projector->on() _projector->setInput(dvd) _projector->wideScreenMode() _amp->on() _amp->setDvd(dvd) _amp->setSurroundSound() _amp->setVolume(5) _dvd->on() _dvd->play() } void endMovie() { _popper->off(); _lights->off(); _screen->off(); _projector->off(); _amp->off(); _dvd->stop(); _dvd->off(); } private: Amplifier *_amp = nullptr; Tuner *_tuner = nullptr; CdPlayer *cd = nullptr; DvdPlayer *_dvd = nullptr; Projector *_projector = nullptr; TheaterLights *_lights = nullptr; Screen *_screen = nullptr; PopcornPopper *_popper = nullptr; };

2.意圖

為一個子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。

3.適用性

  1. 當你需要為一個複雜的子系統提供一個簡單的介面的時候。
  2. 客戶端與抽象類的實現之間存在很大的依賴性,引入Facade將這個子系統與客戶端以及其他子系統分離,可以提高子系統的獨立性與可移植性。
  3. 如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化它們之間的依賴關係。

4.結構

這裡寫圖片描述
Facade模式通常配合很多子系統一起使用。

5.效果

1> 它對客戶遮蔽了子系統元件,因而減少了客戶處理物件的數目並使得子系統實用起來更加方便。
2> 它實現了子系統與客戶之間的鬆耦合關係,而子系統內部往往是緊耦合的。在大型軟體系統中降低編譯依賴性至關重要,在子系統改變時,希望儘量減少重編譯時間以節省時間,而Facade模式可以降低編譯依賴性。
3>如果客戶需要,它並不限制客戶直接使用子系統。

6.實現

1> 降低客戶-子系統之間的耦合度。用抽象類實現Facade,而它的具體子類對應於不同的子類系統,這可以進一步降低客戶與子系統的耦合度。

7.程式碼示例

相關推薦

設計模式學習總結外觀模式Facade

1.場景分析 如下圖所示,我們有一個家庭影院系統,其中包含了調音器、擴音器、播放器、劇場光、爆米花機等部分: 然後我們模擬使用這個系統來播放一部電影,則我們需要進行一下操作: //開啟爆米花機,開始爆米花 popper.on() popper.pop(

設計模式學習總結觀察者模式Observer Pattern

意圖 定義物件間的一種一對多的依賴關係,當一個物件的狀態發生變化時,所以依賴於它的物件都得到通知並被自動更新。 適用性 當一個抽象物件有兩個方面,其中一個方面依賴於另一個方面。將這兩者封裝在兩個獨立的物件中使它們可以被獨立地改變與複用。 當對一個物件

設計模式學習總結單例模式Singleton

意圖 保證類只有一個例項,並提供一個訪問它的全域性訪問點。 適用性 當類只能有一個例項而且客戶可以通過一個眾所周知的訪問點訪問它時。 當這個唯一例項應該是通過子類可擴充套件時 結構 優缺點 優點 1>對唯一例項的受控訪

設計模式學習總結模板方法模式Template Method

1.場景分析 茶和咖啡是兩種飲料,但是它們的沖泡方法十分相似,沖泡方法如下。 茶:把水煮沸->沸水浸泡茶葉->把茶倒進杯子->加檸檬 咖啡:把水煮沸->用沸水沖泡咖啡->把咖啡裝進杯子->加糖和牛奶 用程式碼來實現咖啡

設計模式學習筆記 C#代碼

內容 編程 繼承 color 模式 c# 派生類 ive spa 《深入淺出設計模式》學習筆記第一章 原始需求和設計 事情是這樣開始的,公司需要做一套程序,鴨子,設計如下: 一個鴨子父類,多個派生類,三個可override的方法。 第一次需求變更 我們要會飛的鴨子!!!!

設計模式學習心得<外觀模式 Facade>

定義 RR 訪問 HA 模塊 class 方便 sys 分享 外觀模式(Facade Pattern)隱藏系統的復雜性,並向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的復雜性。 這種模式涉及到一個單一的

設計模式學習筆記九------外觀模式

目錄 本文的結構如下: 什麼是外觀模式 模式的結構 程式碼示例 優點和缺點 適用環境 模式應用 模式擴充套件 補充 一、前言 話說某天空氣質量回到秦漢,月色如水傾瀉,溫度適宜,微風襲人,我在院子樹下架起圓木桌,擺上雕花凳,桌上依次擺放紅燒肘子,燒牛肉,剁椒

設計模式學習總結(5) 原型模式

本系列主要記錄設計模式的意圖是什麼,它要解決一個什麼問題,什麼時候可以使用它;它是如何解決的,掌握它的結構圖,記住它的關鍵程式碼;能夠想到至少兩個它的應用例項,一個生活中的,一個軟體中的;這個模式的優缺點是什麼,其有哪些使用場景,在使用時要注意什麼。 (adsbygoogle = w

設計模式與應用外觀模式

本文通俗的介紹外觀模式,且與策略模式進行對比及選用 簡介 Facade模式也叫外觀模式,是由GoF提出的23種設計模式種的一種 Facade模式為一組具有類似功能的類群,比如類庫,子系統等等,提供一個一致的簡單的介面。這個

設計模式學習總結(20) 狀態模式

關鍵程式碼:通常命令模式的介面中只有一個方法. 而狀態模式的介面中有1個或者多個方法.而且,狀態模式的實現類的方法,一般返回值;或者是改變例項變數的值.也就是說,狀態模式一般和物件的狀態有關.實現類的方法有不同的功能,覆蓋介面中的方法.狀態模式和命令模式一樣,也可以用於消除if…else等條件選擇語句.應用例

Java面試系列總結 JavaSE高階

1. 說說你對Java中反射的理解 Java 中的反射首先是能夠獲取到 Java 中要反射類的位元組碼,獲取位元組碼有三種方法,1.Class.forName(className) 2.類名.class 3.this.getClass()。然後將位元組碼中的方法,變數,建構函式等

Vue 2.0學習筆記事件匯流排EventBus

許多現代JavaScript框架和庫的核心概念是能夠將資料和UI封裝在模組化、可重用的元件中。這對於開發人員可以在開發整個應用程式時避免使用編寫大量重複的程式碼。雖然這樣做非常有用,但也涉及到元件之間的資料通訊。在Vue中同樣有這樣的概念存在。通過前面一段時間的學習,Vue元件資料通訊常常會有父子元

機器學習演算法交叉驗證——監督學習器效能評估方法 [ sklearn.model_selection.cross_val_score()官方翻譯 ]

交叉驗證——(監督)學習器效能評估方法 一、思考:交叉驗證有什麼好值得我們使用的? 每個演算法模型都需要經過兩個階段:訓練和驗證。 1) 一般情況下的,我們用的方法是:將原始資料集分為 訓練資料集 & 測試資料集。 優點:是,但僅僅是思路正確。 缺點:思

Java面試系列總結 JavaSE基礎2 常用 API

1. Math.round(11.5)等於多少?Math.round(- 11.5) 又等於多少? Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。 四捨五入的原理是在引數上加 0.5然後進行取整。 2.

Java面試系列總結 JavaSE基礎1 面向物件/語法/異常

1. 面向物件都有哪些特性以及你對這些特性的理解 繼承:繼承是從已有類得到繼承資訊建立新類的過程。提供繼承資訊的類被稱為父類(超類、基類);得到繼承資訊的類被稱為子類(派生類)。繼承讓變化中的軟體系統有了一定的延續性,同時繼承也是封裝程式中可變因素的 重要

python科學計算學習matplotlib繪圖1

matplotlib繪圖(1) 部落格地址:http://blog.csdn.net/ikerpeng/article/details/20370041     matplotlib是python另一個非常重要的工具包。使用它可以繪製精美的圖表。它學起來也是非常容易。下

uCOS-II學習筆記實時作業系統

1.前後臺系統:前後臺系統的架構用一句話來形容的話,就是一個大的迴圈,加上中斷,就形成了一個整的體系。 假設來了中斷需要處理模組3,如果模組3的處理是最緊迫的,但是當前cpu 只執行到模組1, 這樣的話,必須還要承受模組2的執行時間延遲,才能輪到模組3的處理,當模組越多的

Azure學習筆記Cloud Service4

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> <h1>Customer Information Management</h1> <p>

Tensorflow學習筆記基礎篇7——Mnist手寫集改進版Tensorboard視覺化

Tensorflow學習筆記:基礎篇(7)——Mnist手寫集改進版(Tensorboard視覺化介面) 前序 — 前文中,我們在三層全連線神經網路中使用了學習率隨迭代次數增加而逐漸衰減的AdamOptimizer優化器來完成MNIST資料的分類問題,最

Python爬蟲學習6scrapy入門爬取汽車評論並儲存到csv檔案

一、scrapy 安裝:可直接使用Anaconda Navigator安裝, 也可使用pip install scrapy安裝二、建立scrapy 爬蟲專案:語句格式為 scrapy startproject project_name生成的爬蟲專案目錄如下,其中spiders