概述
想想我們小時候玩的四驅車,里面的構造很復雜,馬達,舵機,電池組等等,而我們控制它卻非常簡單,只要打開電池開關,他就可以跑。我們其實不用知道它里面是如何工作,只要知道撥動開關它就可以工作就行了,這個開關其實就四驅車給我們的一個友好的組件,使得我們可以很方便的控制它。
外觀模式其實定義了一個高層接口,該接口為子系統中的一組接口提供一個一致的界面,使得這一子系統更加容易使用。
類圖和樣例
在這個對象圖中,出現了兩個角色:
外觀( 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; }
要點
1 . Facade 模式對客戶屏蔽了子系統組件,因而減少了客戶處理的對象的數目并使得子系統使用起來更加方便。
2 . Facade 模式實現了子系統與客戶之間的松耦合關系,而子系統內部的功能組件往往是緊耦合的。松耦合關系使得子系統的組件變化不會影響到它的客戶。
3 .如果應用需要,它并不限制它們使用子系統類。因此你可以在系統易用性與通用性之間選擇。
4.在外觀模式中,通常只需要一個外觀類,并且此外觀類只有一個實例,換言之它是一個單例類。當然這并不意味著在整個系統里只能有一個外觀類,而僅僅是說對每一個子系統只有一個外觀類。或者說,如果一個系統有好幾個子系統的話,每一個子系統有一個外觀類,整個系統可以有數個外觀類。
5. 外觀 模式的用意是為子系統提供一個集中化和簡化的溝通管道,而不建議向子系統加入新的行為。
6.外觀模式注重的是簡化接口,它更多的時候是從架構的層次去看整個系統,而并非單個類的層次。
適用性和優缺點
適用性
1 .為一個復雜子系統提供一個簡單接口。
2 .提高子系統的獨立性。
3 .在層次化結構中,可以使用 Facade 模式定義系統中每一層的入口。
優點
1. 松散耦合
外觀模式松散了客戶端與子系統的耦合關系,讓子系統內部的模塊能更容易擴展和維護。即要點2.
2. 簡單易用
外觀模式讓子系統更加易用,客戶端不再需要了解子系統內部的實現,也不需要跟眾多子系統內部的模塊進行交互,只需要跟外觀交互就可以了,相當于外觀類為外部客戶端使用子系統提供了一站式服務。
3. 更好的劃分訪問層次
通過合理使用
Facade
,可以幫助我們更好的劃分訪問的層次。有些方法是對系統外的,有些方法是系統內部使用的。把需要暴露給外部的功能集中到外觀中,這樣既方便客戶端使用,也很好的隱藏了內部的細節。
缺點
過多的或者是不太合理的 Facade 也容易讓人迷惑,到底是調用 Facade 好呢,還是直接調用模塊好。
LCL_data原創于CSDN.NET【 http://blog.csdn.net/lcl_data/article/details/8841779 】
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
