程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++設計形式以外不雅形式

C++設計形式以外不雅形式

編輯:關於C++

C++設計形式以外不雅形式。本站提示廣大學習愛好者:(C++設計形式以外不雅形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式以外不雅形式正文


媒介

在現實開辟時,面臨一個年夜的體系,老是會將一個年夜的體系分紅若干個子體系,等子體系完成以後,再分離挪用對應的子體系來完成對應的全體功效,如許有益於下降體系的龐雜性;終究停止完成某個詳細的功效時,我們將對應的子體系停止組合就行了;然則,子體系那末多,關系那末龐雜,組合構成一個完全的體系,是存在難度的。

我們在應用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形式。關於外不雅形式到此就總結完成了,確定有一些處所漏掉了,請年夜家斧正。我深信,分享使我們加倍提高。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved