最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++設計模式之外觀模式

 更新時間:2014年10月01日 13:43:31   投稿:junjie  
這篇文章主要介紹了C++設計模式之外觀模式,本文詳細講解了C++中的Facade模式,并給出了實例代碼,需要的朋友可以參考下

前言

在實際開發(fā)時,面對一個大的系統(tǒng),總是會將一個大的系統(tǒng)分成若干個子系統(tǒng),等子系統(tǒng)完成之后,再分別調用對應的子系統(tǒng)來完成對應的整體功能,這樣有利于降低系統(tǒng)的復雜性;最終進行實現(xiàn)某個具體的功能時,我們將對應的子系統(tǒng)進行組合就好了;但是,子系統(tǒng)那么多,關系那么復雜,組合形成一個完整的系統(tǒng),是存在難度的。

我們在使用visual studio進行編譯C++代碼時,你只是在菜單中選擇了Build,然后visual studio就開始了一堆的編譯工作;你應該知道,因為你的一個簡單的Build動作,編譯器在后臺會進行語法分析,生成中間代碼,生成匯編代碼,鏈接成可執(zhí)行程序或庫等等動作;而這一切,作為只是開發(fā)程序的我們,而不用去理解編譯器在做什么的,編譯器向我們隱藏了背后的一系列復雜操作,而只提供一個Build按鈕,這個Build按鈕,就可以執(zhí)行一切的操作;當單擊這個Build按鈕時,Build在幕后,將任務分發(fā)給不同的子系統(tǒng)去完成,最終子系統(tǒng)進行協(xié)作完成了整個的編譯任務。而這樣隱藏一些復雜操作,只提供一個更高層的統(tǒng)一接口,就是我今天總結的外觀模式。

什么是外觀模式?

外觀模式,很多人也把它叫做門面模式。在GOF的《設計模式:可復用面向對象軟件的基礎》一書中對外觀模式是這樣說的:將子系統(tǒng)中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。細細的理解這句話;子系統(tǒng)中的一組接口,就好比上面舉得例子中的語法分析,生成中間代碼,生成匯編代碼,鏈接成可執(zhí)行程序或庫;外觀模式定義的一個高層接口,就好比上面說的Build按鈕,通過這樣的一個Build按鈕,讓編譯器更加容易使用,對于這一點,從Linux C++/C轉Windows C++/C的程序員是最有體會的。visual studio提供的強大功能,只需要一個Build按鈕,就可以進行Build動作,而不需要去寫makefile文件,然后再去執(zhí)行一些命令進行編譯。

UML類圖

Facade:知道哪些子系統(tǒng)類負責處理請求,并且將客戶的請求代理給適當?shù)淖酉到y(tǒng)對象;

SubSystem:實現(xiàn)子系統(tǒng)具體的功能;處理由Facade對象指派的任務;但是,SubSystem沒有Facade的任何相關信息,也就是說,沒有指向Facade的指針。

Client通過發(fā)送請求給Facade的方式與子系統(tǒng)進行通信,而不直接與子系統(tǒng)打交道,F(xiàn)acade將這些消息轉發(fā)給適當?shù)淖酉到y(tǒng)對象。盡管是子系統(tǒng)中的有關對象在做實際工作,但Facade模式本身也必須將它的接口轉換成子系統(tǒng)的接口,這里是不是有點適配器模式的感覺呢?這就是學習結構型設計模式的感覺,感覺都很相似,但是仔細的去研究時,就會發(fā)現(xiàn)各自的用處。

代碼實現(xiàn)

這里實現(xiàn)的代碼就是參照我上面舉的編譯器的例子。

復制代碼 代碼如下:

/*
** FileName     : FacadePatternDemo
** Author       : Jelly Young
** Date         : 2014/1/2
** Description  : More information, please go to http://www.fzitv.net
*/
 
#include <iostream>
using namespace std;
 
// 語法分析子系統(tǒng)
class CSyntaxParser
{
public:
     void SyntaxParser()
     {
          cout<<"Syntax Parser"<<endl;
     }
};
 
// 生成中間代碼子系統(tǒng)
class CGenMidCode
{
public:
     void GenMidCode()
     {
          cout<<"Generate middle code"<<endl;
     }
};
 
// 生成匯編代碼子系統(tǒng)
class CGenAssemblyCode
{
public:
     void GenAssemblyCode()
     {
          cout<<"Generate assembly code"<<endl;
     }
};
 
// 鏈接生成可執(zhí)行應用程序或庫子系統(tǒng)
class CLinkSystem
{
public:
     void LinkSystem()
     {
          cout<<"Link System"<<endl;
     }
};
 
class Facade
{
public:
     void Compile()
     {
          CSyntaxParser syntaxParser;
          CGenMidCode genMidCode;
          CGenAssemblyCode genAssemblyCode;
          CLinkSystem linkSystem;
          syntaxParser.SyntaxParser();
          genMidCode.GenMidCode();
          genAssemblyCode.GenAssemblyCode();
          linkSystem.LinkSystem();
     }
};
 
// 客戶端
int main()
{
     Facade facade;
     facade.Compile();
}

上面的代碼很簡單。我們可以想象,如果沒有使用外觀模式,在客戶端如果要進行Compile同樣的動作時,就需要寫一堆和Compile中一樣的代碼;是的,你會說,寫就寫吧。但是,有的時候,客戶端并不會非常熟悉子系統(tǒng)之間的關系,就好比,先要進行語法分析,再生成中間代碼,然后生成匯編語言,最后進行鏈接一樣。如果客戶端不知道這個時序,那怎么辦?所以,外觀模式讓一切復雜的東西,使用起來都變的簡單了。

優(yōu)點

1.它對客戶屏蔽了子系統(tǒng)組件,因而減少了客戶處理的對象的數(shù)目,并使得子系統(tǒng)使用起來更加方便;

2.它實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關系,而子系統(tǒng)內部的功能組件往往是緊耦合的;松耦合系統(tǒng)使得子系統(tǒng)的組件變化不會影響到它的客戶。外觀模式有助于建立層次結構系統(tǒng),也有助于對對象之間的依賴關系分層。外觀模式可以消除復雜的循環(huán)依賴關系。這一點在客戶程序與子系統(tǒng)是分別實現(xiàn)的時候尤為重要。

使用場合

1.當你要為一個復雜子系統(tǒng)提供一個簡單接口時。子系統(tǒng)往往因為不斷演化而變的越來越復雜。大多數(shù)模式使用時都會產生更多更小的類。這使得子系統(tǒng)更具有可重用性,也更容易對子系統(tǒng)進行定制,但這也給那些不需要定制子系統(tǒng)的用戶帶來一些使用上的困難。外觀模式可以提供一個簡單的缺省視圖,這一視圖對大多數(shù)用戶來說已經足夠,而那些需要更多的可定制性的用戶可以越過Facade層;

2.當客戶程序與抽象類的實現(xiàn)部分之間存在很大的依賴性。引入Facade將這個子系統(tǒng)與客戶以及其他的子系統(tǒng)分離,可以提高子系統(tǒng)的獨立性和可移植性;

3.當需要構建一個層次結構的子系統(tǒng)時,使用外觀模式定義子系統(tǒng)中每層的入口點。如果子系統(tǒng)之間是相互依賴的,我們就可以讓它們僅通過Facade進行通訊,從而簡化了它們之間的依賴關系。

總結

外觀模式簡單易用,讓客戶能更簡單的去使用子系統(tǒng);在拜讀別人的文章時,有以下總結非常好,我也借鑒一下:

1.在設計初期,應該有意識的將不同層分離,比如常用的三層架構,就是考慮在數(shù)據(jù)訪問層,與業(yè)務邏輯層表示層之間,建立Facade,使復雜的子系統(tǒng)提供一個簡單的接口,降低耦合性;

2.在開發(fā)階段,子系統(tǒng)往往因為不斷的重構而變的越來越復雜,增加外觀Facade可以提供一個簡單的接口,減少它們之間的依賴;

3.在維護階段,可能這個系統(tǒng)已經非常難以維護和擴展了,此時你可以為新系統(tǒng)開發(fā)一個外觀類,來提供設計粗糙或高度復雜的遺留代碼的比較清晰簡單的接口,讓新系統(tǒng)與Facade對象交互,F(xiàn)acade與遺留代碼交互所有復雜的工作。

通常來講,對于子系統(tǒng)的訪問,我們提供一個Facade層,而這個Facade入口,只需要一個;也就是說在使用Facade時,我們可以使用單例模式來實現(xiàn)Facade模式。對于外觀模式到此就總結完成了,肯定有一些地方遺漏了,請大家指正。我堅信,分享使我們更加進步。

相關文章

  • C語言實現(xiàn)經典掃雷游戲流程

    C語言實現(xiàn)經典掃雷游戲流程

    掃雷是電腦上很經典的游戲,特意去網上玩了一會,幾次調試之后,發(fā)現(xiàn)這個比三子棋要復雜一些,尤其是空白展開算法上和堵截玩家有的一拼,與實際游戲差別較大,不能使用光標,下面來詳解每一步分析
    2021-11-11
  • C語言實現(xiàn)登錄注冊和忘記密碼功能

    C語言實現(xiàn)登錄注冊和忘記密碼功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)登錄、注冊和忘記密碼功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++利用PCL點云庫操作txt文件詳解

    C++利用PCL點云庫操作txt文件詳解

    這篇文章主要為大家詳細介紹了C++如何利用PCL點云庫操作txt文件,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2024-01-01
  • C++通過共享內存ShellCode實現(xiàn)跨進程傳輸

    C++通過共享內存ShellCode實現(xiàn)跨進程傳輸

    在計算機安全領域,ShellCode是一段用于利用系統(tǒng)漏洞或執(zhí)行特定任務的機器碼,本文主要為大家介紹了C++如何通過共享內存ShellCode實現(xiàn)跨進程傳輸,需要的可以參考下
    2023-12-12
  • C語言用fstat函數(shù)獲取文件的大小方法

    C語言用fstat函數(shù)獲取文件的大小方法

    今天小編就為大家分享一篇關于C語言用fstat函數(shù)獲取文件的大小方法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++線程安全的單例模式講解

    C++線程安全的單例模式講解

    今天小編就為大家分享一篇關于C++線程安全的單例模式講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C語言實現(xiàn)簡單計算器程序

    C語言實現(xiàn)簡單計算器程序

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單計算器程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++調用C函數(shù)實例詳解

    C++調用C函數(shù)實例詳解

    這篇文章主要介紹了C++調用C函數(shù)實例詳解的相關資料,需要的朋友可以參考下
    2017-07-07
  • C語言刪除輸入字符串中的空格示例代碼

    C語言刪除輸入字符串中的空格示例代碼

    最近工作中遇到了需求,要刪除字符串中的所有空格,就要篩選出空格字符,這篇文章主要給大家介紹了關于利用C語言刪除輸入字符串中的空格的相關資料,需要的朋友可以參考下
    2022-12-12
  • C++實現(xiàn)本地TCP通訊的示例代碼

    C++實現(xiàn)本地TCP通訊的示例代碼

    這篇文章主要為大家詳細介紹了C++如何利用TCP技術,實現(xiàn)本地ROS1和ROS2的通訊,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-02-02

最新評論

措勤县| 平舆县| 赞皇县| 河东区| 洪雅县| 大名县| 嵊泗县| 明溪县| 准格尔旗| 湄潭县| 家居| 达拉特旗| 红安县| 太白县| 沈丘县| 公主岭市| 遵化市| 四川省| 双辽市| 林周县| 余江县| 凤庆县| 泉州市| 望城县| 菏泽市| 青浦区| 廉江市| 安福县| 同德县| 衡水市| 天台县| 通山县| 梨树县| 瑞安市| 石狮市| 秭归县| 任丘市| 高碑店市| 项城市| 丰宁| 利津县|