外觀模式相比較之下比較簡單,模式設計中定義是為子系統中的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面是的這一子系統更加容易使用。
如果不理解呢,簡單些說就是外觀模式提供了為內部提供了同意的介面層,解耦了子系統和客戶端,這樣客戶端只需要知道外觀類存在即可,不需要知道具體子系統是如何實現的。舉乙個簡單的例子,海參麵館中兩個主打麵食是:
兩個主打麵食都由乙個師傅來做,這個師傅會這兩種麵食的做法。具體的做法呢如下:
- 海參炒麵
1. 剝蒜
2. 拉麵
3. 做湯底
- 辣根湯麵
1. 製作辣根
這兩種麵食都有複雜的做法,呼叫者如果直接呼叫這種步驟,會讓呼叫者與師傅的耦合性很高,如果有一天製作步驟改了,辣根湯麵要剝蒜,那就需要修改呼叫者介面,這樣是不可以的。
所以這時候師傅就是乙個外觀類,呼叫者只需要和他說,我需要乙份海參炒麵或者辣根湯麵即可,具體如何做,就是師傅的事情了。外部不需要管。uml類圖如下:
下面是剝蒜類實現,非常簡單,只完成剝蒜動作即可。
#ifndef gralic_h
#define gralic_h
class gralic
;#endif // gralic_h
#include #include "gralic.h"
gralic::gralic()
gralic::~gralic()
void gralic::peelinggralic()
下面是拉麵類實現,只實現拉麵動作即可。
#ifndef noodle_h
#define noodle_h
class noodle
;#endif // noodle_h
#include #include "noodle.h"
noodle::noodle()
noodle::~noodle()
void noodle::makenoodle()
其餘子系統類似,就不在此展示了,包括:做湯底類和製作辣根類。
下面是外觀模式,廚師師傅類,包含兩個介面:製作海參炒麵和辣根湯麵。但是實現部分是使用各個子系統中的類和介面完成的,完成了客戶端呼叫的解耦動作。
#ifndef cooke***cade_h
#define cooke***cade_h
class gralic;
class noodle;
class soup;
class lagen;
class cooke***cade
;#endif // cooke***cade_h
#include #include "cooke***cade.h"
#include "gralic.h"
#include "noodle.h"
#include "soup.h"
#include "lagen.h"
cooke***cade::cooke***cade()
cooke***cade::~cooke***cade()
void cooke***cade::makehaishennoodle()
void cooke***cade::makelagennoodle()
下面是客戶端**,可以很明顯的看出他只需要知道外觀師傅的類即可,別的細節並不需要知道。
#include #include "cooke***cade.h"
using namespace std;
int main()
下面是編譯需要的cmakelists.txt檔案:
cmake_minimum_required(version 2.8)
project(cooker-facade)
set(src_list main.cpp soup.h soup.cpp gralic.h gralic.cpp cooke***cade.h cooke***cade.cpp noodle.h noodle.cpp
lagen.h lagen.cpp)
add_executable($ $)
**執行的結果如下:
blog@blog-virtualbox:~/build-cooker-facade-unknown-default$ ./cooker-facade
老闆,來乙份辣根湯麵!!!
開始製作辣根!!!
開始作辣根湯麵啦!!!
老闆,換乙份海參炒麵!!!
開始剝蒜啦!!!
開始拉麵啦!!!
開始做湯底啦!!!
開始做海參炒麵啦!!!
其實外觀模式我們可能一直在用,只是我們不知道自己在用外觀模式而已,平時我們開發乙個系統的時候,對外api完全封裝內部子系統介面,以達到便於擴充套件可維護的目的,其實用的就是外觀模式。這種模式可以充分解耦客戶端和子系統。同時也是應用比較廣比較簡單的設計模式。 深入淺出設計模式 模板模式
設計模式是程式設計師必須掌握的技能,熟練應用各種設計模式,不僅可以提公升我們的編碼能力,也可以使得我們的編碼更美觀。在這裡我們來講解一下模板模式。模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式...
深入淺出設計模式 工廠模式
披薩店新推出了點單系統,披薩需要通過不同的製作,相同的烘焙,裁剪等工序才能完成。披薩的種類實在太多了,在構造披薩例項時,光是if else 語句就長的可怕,修改與維護更令人頭疼。披薩子類繼承實現相同的基類,通過基類呼叫不同的子類,使得 具有一定的彈性,將構造子類放入業務 導致了子類與業務 的耦合,令...
深入淺出設計模式 設計模式之路
2.2 根據模式的作用劃分 3.總結 博主經過6年的 洗禮,慢慢意識到 中使用設計模式的重要性。然而,在我遇到的程式設計師大軍中,我大概歸類了以下幾類人 因此,博主計畫做乙個設計模式的系列帖子,記錄學習筆記,力求深入淺出設計模式。目前有23種設計模式。設計模式有兩種分類方法,一種是根據模式的目的來劃...