亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

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

2020-05-23 14:20:55
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式之外觀模式,本文詳細講解了C++中的Facade模式,并給出了實例代碼,需要的朋友可以參考下
 
 

前言

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

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

什么是外觀模式?

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

UML類圖

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

Facade:知道哪些子系統類負責處理請求,并且將客戶的請求代理給適當的子系統對象;

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

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

代碼實現

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

 

復制代碼代碼如下:

/*
** FileName     : FacadePatternDemo
** Author       : Jelly Young
** Date         : 2014/1/2
** Description  : More information, please go to http://www.49028c.com
*/
 
#include <iostream>
using namespace std;
 
// 語法分析子系統
class CSyntaxParser
{
public:
     void SyntaxParser()
     {
          cout<<"Syntax Parser"<<endl;
     }
};
 
// 生成中間代碼子系統
class CGenMidCode
{
public:
     void GenMidCode()
     {
          cout<<"Generate middle code"<<endl;
     }
};
 
// 生成匯編代碼子系統
class CGenAssemblyCode
{
public:
     void GenAssemblyCode()
     {
          cout<<"Generate assembly code"<<endl;
     }
};
 
// 鏈接生成可執行應用程序或庫子系統
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中一樣的代碼;是的,你會說,寫就寫吧。但是,有的時候,客戶端并不會非常熟悉子系統之間的關系,就好比,先要進行語法分析,再生成中間代碼,然后生成匯編語言,最后進行鏈接一樣。如果客戶端不知道這個時序,那怎么辦?所以,外觀模式讓一切復雜的東西,使用起來都變的簡單了。

優點

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

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

使用場合

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

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

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

總結

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

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

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品资源美女情侣酒店| 色多多国产成人永久免费网站| 这里只有精品在线观看| 97在线免费视频| 欧美在线影院在线视频| 欧美激情视频网站| 亚洲天堂2020| 狠狠躁夜夜躁人人爽超碰91| 亚洲福利在线视频| 精品久久久久久久久久久| 日韩欧美在线免费| 亚洲人成欧美中文字幕| 亚洲男人天堂2023| 日韩中文字幕在线精品| 久久夜精品va视频免费观看| 久久久亚洲欧洲日产国码aⅴ| 国产精品美女久久久久久免费| 欧美日韩在线观看视频| 成人网在线免费看| 成人免费激情视频| 日韩精品在线免费观看| 欧美裸体视频网站| 日韩精品高清在线观看| 91欧美精品午夜性色福利在线| 国产在线视频欧美| 国产精品美女免费视频| 97高清免费视频| 亚洲天堂男人天堂女人天堂| 91精品在线国产| 国产亚洲日本欧美韩国| 欧美日韩亚洲一区二| 精品国产依人香蕉在线精品| 欧美日韩国产精品一区二区三区四区| 91经典在线视频| 黄色一区二区三区| 97婷婷大伊香蕉精品视频| 日韩av在线免费看| 久99九色视频在线观看| 国产欧美va欧美va香蕉在| 久久久久久久久久国产精品| 国产日韩欧美另类| 久久久免费观看视频| 国产一区二区三区在线| 91精品视频免费| 国产精品爽黄69| 日韩av在线免费播放| 日韩欧美高清视频| 日韩欧美一区二区三区| 欧美国产日韩在线| 国产成人亚洲综合91| 欧美成人自拍视频| 欧美日韩亚洲视频| 国产97人人超碰caoprom| 亚洲区中文字幕| 欧美肥老妇视频| 欧美日韩国产综合新一区| 国产在线拍偷自揄拍精品| 欧美日韩国产一中文字不卡| 神马久久桃色视频| 日韩欧美黄色动漫| 日韩女优人人人人射在线视频| 国产成人高潮免费观看精品| 日韩影视在线观看| 国产视频久久久| 精品在线观看国产| 国产999精品视频| 国内免费精品永久在线视频| 久久久www成人免费精品| 国产不卡av在线| 欧美成人在线免费视频| 高清欧美性猛交xxxx黑人猛交| 亚洲日本成人女熟在线观看| 亚洲精品视频久久| 国产欧美一区二区三区视频| 精品国产欧美成人夜夜嗨| 成人免费视频网| 国产国语videosex另类| 久久99精品国产99久久6尤物| 欧美二区乱c黑人| 国产精品久久在线观看| 色偷偷噜噜噜亚洲男人| 欧美一级大片在线观看| 成人国产在线激情| 菠萝蜜影院一区二区免费| 欧美成人免费va影院高清| 亚洲精品中文字幕女同| 成人免费观看a| 日韩av电影在线播放| 久久亚洲春色中文字幕| 亚洲色无码播放| 国产精品入口免费视频一| 日韩视频免费大全中文字幕| 日韩国产精品亚洲а∨天堂免| 亚洲天堂视频在线观看| 国产精品盗摄久久久| 国产69精品久久久| 91经典在线视频| 伊人久久五月天| 国产精品欧美日韩久久| 一区二区在线免费视频| 国产一区二区三区四区福利| 91av在线免费观看视频| 亚洲级视频在线观看免费1级| 91在线观看免费观看| 欧美日韩免费区域视频在线观看| 欧美日韩一二三四五区| 在线丨暗呦小u女国产精品| 91人人爽人人爽人人精88v| 久久人人爽人人爽人人片亚洲| 97超碰国产精品女人人人爽| 日韩第一页在线| 日韩欧美在线视频免费观看| 日韩亚洲欧美中文在线| 欧美日韩一区免费| 亚洲变态欧美另类捆绑| 在线国产精品播放| 欧美午夜精品久久久久久久| 久久99精品久久久久久噜噜| 国产精品一区二区久久久| 亚洲午夜色婷婷在线| 欧美精品久久一区二区| 久久久久久久久久久久久久久久久久av| 亚洲精品国产精品自产a区红杏吧| 欧洲永久精品大片ww免费漫画| 欧美视频专区一二在线观看| 欧美日本精品在线| 国产成人一区二区三区电影| 高清日韩电视剧大全免费播放在线观看| 日本国产高清不卡| 成人精品视频99在线观看免费| 精品中文字幕久久久久久| 一区二区欧美日韩视频| 97在线日本国产| 欧美日韩在线第一页| 久久精品99无色码中文字幕| 久久成人这里只有精品| 亚洲视频电影图片偷拍一区| 青青草精品毛片| 亚洲爱爱爱爱爱| www.国产精品一二区| 国产欧美精品在线播放| 97婷婷涩涩精品一区| 欧美性猛交xxxx久久久| 久久精品国产96久久久香蕉| 中文字幕在线看视频国产欧美在线看完整| 成人免费大片黄在线播放| 91av视频在线播放| 在线观看视频99| 亚洲欧美综合另类中字| 一区二区三区久久精品| 日韩av不卡在线| 热久久这里只有精品| 欧美日韩国产在线播放| 久久久久久com| 精品香蕉一区二区三区| 欧美亚洲国产视频| 久久久久免费视频| 国产精品吴梦梦| 久久精品视频亚洲| 疯狂欧美牲乱大交777| 国产视频亚洲视频| 日韩精品在线观看视频| 久久国产加勒比精品无码| 欧美精品videosex极品1|