C++設計模式之面板模式_C 語言

來源:互聯網
上載者:User

前言

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

我們在使用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類圖

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.jb51.net
*/
 
#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模式。對於面板模式到此就總結完成了,肯定有一些地方遺漏了,請大家指正。我堅信,分享使我們更加進步。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.