1. 程式人生 > >我所理解的設計模式(C++實現)——外觀模式(Facade Pattern)

我所理解的設計模式(C++實現)——外觀模式(Facade Pattern)

概述

想想我們小時候玩的四驅車,裡面的構造很複雜,馬達,舵機,電池組等等,而我們控制它卻非常簡單,只要開啟電池開關,他就可以跑。我們其實不用知道它裡面是如何工作,只要知道撥動開關它就可以工作就行了,這個開關其實就四驅車給我們的一個友好的元件,使得我們可以很方便的控制它。

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

類圖和樣例


在這個物件圖中,出現了兩個角色:

外觀(Facade)角色:客戶端可以呼叫這個角色的方法。此角色知曉相關的(一個或者多個)子系統的功能和責任。在正常情況下,本角色會將所有從客戶端發來的請求委派到相應的子系統去。

子系統(subsystem)角色:可以同時有一個或者多個子系統。每一個子系統都不是一個單獨的類,而是一個類的集合。每一個子系統都可以被客戶端直接呼叫,或者被外觀角色呼叫。子系統並不知道外觀的存在,對於子系統而言,外觀僅僅是另外一個客戶端而已。

#include<iostream>
using namespace std;
class Scanner  
{  
public:  
	void Scan() { cout<<"詞法分析"<<endl; }  
};  
class Parser  
{  
public:  
	void Parse() { cout<<"語法分析"<<endl; }  
};  
class GenMidCode  
{  
public:  
	void GenCode() { cout<<"產生中間程式碼"<<endl; }  
};  
class GenMachineCode  
{  
public:  
	void GenCode() { cout<<"產生機器碼"<<endl;}  
};  
//高層介面  Fecade
class Compiler  
{  
public:  
	void Run()   
	{  
		Scanner scanner;  
		Parser parser;  
		GenMidCode genMidCode;  
		GenMachineCode genMacCode;  
		scanner.Scan();  
		parser.Parse();  
		genMidCode.GenCode();  
		genMacCode.GenCode();  
	}  
};  

//client
int main()  
{  
	Compiler compiler;  
	compiler.Run();  
	return 0;  
}  

要點

1Facade模式對客戶遮蔽了子系統元件,因而減少了客戶處理的物件的數目並使得子系統使用起來更加方便。

2Facade模式實現了子系統與客戶之間的鬆耦合關係,而子系統內部的功能元件往往是緊耦合的。鬆耦合關係使得子系統的元件變化不會影響到它的客戶。

3.如果應用需要,它並不限制它們使用子系統類。因此你可以在系統易用性與通用性之間選擇。

4. 在外觀模式中,通常只需要一個外觀類,並且此外觀類只有一個例項,換言之它是一個單例類。當然這並不意味著在整個系統裡只能有一個外觀類,而僅僅是說對每一個子系統只有一個外觀類。或者說,如果一個系統有好幾個子系統的話,每一個子系統有一個外觀類,整個系統可以有數個外觀類。

5. 外觀模式的用意是為子系統提供一個集中化和簡化的溝通管道,而不建議向子系統加入新的行為。

6. 外觀模式注重的是簡化介面,它更多的時候是從架構的層次去看整個系統,而並非單個類的層次。

適用性和優缺點

適用性

1.為一個複雜子系統提供一個簡單介面。

2.提高子系統的獨立性。

3.在層次化結構中,可以使用Facade模式定義系統中每一層的入口。

優點

1. 鬆散耦合
    外觀模式鬆散了客戶端與子系統的耦合關係,讓子系統內部的模組能更容易擴充套件和維護。即要點2.

2.  簡單易用
    外觀模式讓子系統更加易用,客戶端不再需要了解子系統內部的實現,也不需要跟眾多子系統內部的模組進行互動,只需要跟外觀互動就可以了,相當於外觀類為外部客戶端使用子系統提供了一站式服務。

3. 更好的劃分訪問層次
     通過合理使用Facade,可以幫助我們更好的劃分訪問的層次。有些方法是對系統外的,有些方法是系統內部使用的。把需要暴露給外部的功能集中到外觀中,這樣既方便客戶端使用,也很好的隱藏了內部的細節。

缺點          

過多的或者是不太合理的Facade也容易讓人迷惑,到底是呼叫Facade好呢,還是直接呼叫模組好。

相關推薦

《大話設計模式c++實現 建造者模式

建造者模式(Builder):將一個複雜物件的構建和它的表示分離,使得同樣的構建過程可以建立不同的表示。 角色: (1)Builder:是為建立一個Product物件的各個部件指定的抽象介面。 (2)ConcreteBuilder:是具體建立者,實現Builder介面,構造和裝配各個部件。 (3)

《大話設計模式c++實現 抽象工廠模式

  為了更清晰地理解工廠方法模式,需要先引入兩個概念: 產品等級結構 :產品等級結構即產品的繼承結構,如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。

案例3.2:括號匹配的檢驗c++實現/資料結構/棧的基本操作

#include<iostream> #define MaxSize 100 #define OK 1 #define ERROR 0 using namespace std; typedef char ElemType; typedef int Status

理解設計模式C++實現——迭代器模式Iterator Pattern

概述:         在現在的電視機中,我們使用[後一個]和[前一個]按鈕可以很方便的換臺,當按下[後一個]按鈕時,將切換到下一個預置的頻道。想象一下在陌生的城市中的旅店中看電視。當改變頻道時,重要的不是幾頻道,而是節目內容。如果對一個頻道的節目不感興趣,那麼可以換下一個頻道,而不需要知道它是幾頻道。  

理解設計模式C++實現——責任鏈模式Chain Of Responsibility Pattern

概述:      辛辛苦苦了工作了一年,終於可以加薪了,向主管提交了加薪申請,主管一看不得了,自己職權不夠,批不了,主管把申請上交總監,總監發現自己也批不了,申請到了總經理手中,總經理一看,小夥子口氣不小了,有膽識敢申請,先來談下心。預知後事如何,請看下回分解。     

理解設計模式C++實現——外觀模式Facade Pattern

概述 想想我們小時候玩的四驅車,裡面的構造很複雜,馬達,舵機,電池組等等,而我們控制它卻非常簡單,只要開啟電池開關,他就可以跑。我們其實不用知道它裡面是如何工作,只要知道撥動開關它就可以工作就行了,這個開關其實就四驅車給我們的一個友好的元件,使得我們可以很方便的控制它。 外

理解設計模式C++實現——備忘錄模式Memento Pattern

概述:     我們玩單機遊戲的時候總會遇到老婆大人的各位事情,一會去買瓶醋了,一會去打個醬油了,會耽誤我們玩遊戲的程序,但是此時我們能有“儲存遊戲”這個寶貝,我們的主基地不會在我們打醬油的時候被對手拆掉。     這“儲存遊戲”的功能其實就是備忘錄模式的很好應用,她是在不

理解設計模式C++實現——享元模式Flyweight Pattern

概述 想想我們編輯文件用的wps,文件裡文字很多都是重複的,我們不可能為每一個出現的漢字都建立獨立的空間,這樣代價太大,最好的辦法就是共享其中相同的部分,使得需要建立的物件降到最小,這個就是享元模式的核心,即運用共享技術有效地支援大量細粒度的物件。 享元物件能做到共享的關

理解設計模式C++實現——訪問者模式Visitor Pattern

概述: 我們去銀行櫃檯辦業務,一般情況下會開幾個個人業務櫃檯的,你去其中任何一個櫃檯辦理都是可以的。我們的訪問者模式可以很好付諸在這個場景中:對於銀行櫃檯來說,他們是不用變化的,就是說今天和明天提供個人業務的櫃檯是不需要有變化的。而我們作為訪問者,今天來銀行可能是取消費流水

理解設計模式C++實現——狀態模式State Pattern

概述:      看看我們平時用的開關,同樣一個開關他有2種狀態:開和關,當她處於不同的狀態的時候她的行為是不一樣的,比如當她是開著的時候,你按她一下,她就變成了關閉狀態,她是關著的時候按她一下,她就變成了開著的狀態。看上去就像是改變了它的類一樣,其實我們開發者都知道,我們

設計模式——抽象工廠模式C++實現

concrete out png return style bsp ctp img using 1 #include <iostream> 2 #include <string> 3 4 usin

設計模式——觀察者模式C++實現

ace mes des ret rtu cto pattern virt date 1 #include <iostream> 2 #include <vector> 3 #include <algorithm>

設計模式——命令模式C++實現

clear cto ive pre urn bak std oot style 1 [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp 2 #include <

設計模式——職責鏈模式C++實現

delet hand jin void ng- nbsp request req oot   1 #include <iostream> 2 #include <string> 3 4 using namesp

設計模式——中介者模式/調停者模式C++實現

con 分享 else .cn sign name 得到 ted esp 1 #include <iostream> 2 #include <string> 3 4 using namespace std;

設計模式——單例模式C++實現

一、單例模式定義: 保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點,該例項被所有程式模組共享。 二、應用場景: 比如在某個伺服器程式中,該伺服器的配置資訊存放在一個檔案中,這些配置資料由一個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置

最常用的設計模式---裝飾者模式C++實現

      上一篇說了介面卡模式,這一篇接著學習裝飾者模式。     想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選擇。      裝飾者模式主要實現的功能是動態的給某一個類新增一些額外的功能,它是一個錦上添花者。想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選

設計模式示例C++實現

最近參加了軟考,在準備考試過程中發現其中給出設計類圖讓通過指定的設計模式進行設計的題目對於練習C++和軟體開發是一種不錯的的方式,因為學校中的C++課程只講C++語言,雖然也講了封裝、繼承、多型等特性,但是缺少相應的練習,使得沒有深入的認識和理解。同時類似於程式

Head First 設計模式C++實現:單例模式:Singleton

單例模式:確保一個類只有一個例項,並提供一個全域性訪問點 1 .經典單例模式實現   我們都很清楚一個簡單的單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部儲存一個private static的類指標儲存唯一的例項,例項的動

設計模式---訪問者模式C++實現

/************************************************************************************************************* 適用於:把資料結構 和 作用於資料結構上的操作 進行