概述
想想我們小時(shí)候玩的四驅(qū)車(chē),里面的構(gòu)造很復(fù)雜,馬達(dá),舵機(jī),電池組等等,而我們控制它卻非常簡(jiǎn)單,只要打開(kāi)電池開(kāi)關(guān),他就可以跑。我們其實(shí)不用知道它里面是如何工作,只要知道撥動(dòng)開(kāi)關(guān)它就可以工作就行了,這個(gè)開(kāi)關(guān)其實(shí)就四驅(qū)車(chē)給我們的一個(gè)友好的組件,使得我們可以很方便的控制它。
外觀模式其實(shí)定義了一個(gè)高層接口,該接口為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,使得這一子系統(tǒng)更加容易使用。
類(lèi)圖和樣例
在這個(gè)對(duì)象圖中,出現(xiàn)了兩個(gè)角色:
外觀( Facade ) 角色 :客戶端可以調(diào)用這個(gè)角色的方法。此角色知曉相關(guān)的 ( 一個(gè)或者多個(gè) ) 子系統(tǒng)的功能和責(zé)任。在正常情況下,本角色會(huì)將所有從客戶端發(fā)來(lái)的請(qǐng)求委派到相應(yīng)的子系統(tǒng)去。
子系統(tǒng) (subsystem) 角色 :可以同時(shí)有一個(gè)或者多個(gè)子系統(tǒng)。每一個(gè)子系統(tǒng)都不是一個(gè)單獨(dú)的類(lèi),而是一個(gè)類(lèi)的集合。每一個(gè)子系統(tǒng)都可以被客戶端直接調(diào)用,或者被外觀角色調(diào)用。子系統(tǒng)并不知道外觀的存在,對(duì)于子系統(tǒng)而言,外觀僅僅是另外一個(gè)客戶端而已。
#include<iostream> using namespace std; class Scanner { public: void Scan() { cout<<"詞法分析"<<endl; } }; class Parser { public: void Parse() { cout<<"語(yǔ)法分析"<<endl; } }; class GenMidCode { public: void GenCode() { cout<<"產(chǎn)生中間代碼"<<endl; } }; class GenMachineCode { public: void GenCode() { cout<<"產(chǎn)生機(jī)器碼"<<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; }
要點(diǎn)
1 . Facade 模式對(duì)客戶屏蔽了子系統(tǒng)組件,因而減少了客戶處理的對(duì)象的數(shù)目并使得子系統(tǒng)使用起來(lái)更加方便。
2 . Facade 模式實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,而子系統(tǒng)內(nèi)部的功能組件往往是緊耦合的。松耦合關(guān)系使得子系統(tǒng)的組件變化不會(huì)影響到它的客戶。
3 .如果應(yīng)用需要,它并不限制它們使用子系統(tǒng)類(lèi)。因此你可以在系統(tǒng)易用性與通用性之間選擇。
4.在外觀模式中,通常只需要一個(gè)外觀類(lèi),并且此外觀類(lèi)只有一個(gè)實(shí)例,換言之它是一個(gè)單例類(lèi)。當(dāng)然這并不意味著在整個(gè)系統(tǒng)里只能有一個(gè)外觀類(lèi),而僅僅是說(shuō)對(duì)每一個(gè)子系統(tǒng)只有一個(gè)外觀類(lèi)。或者說(shuō),如果一個(gè)系統(tǒng)有好幾個(gè)子系統(tǒng)的話,每一個(gè)子系統(tǒng)有一個(gè)外觀類(lèi),整個(gè)系統(tǒng)可以有數(shù)個(gè)外觀類(lèi)。
5. 外觀 模式的用意是為子系統(tǒng)提供一個(gè)集中化和簡(jiǎn)化的溝通管道,而不建議向子系統(tǒng)加入新的行為。
6.外觀模式注重的是簡(jiǎn)化接口,它更多的時(shí)候是從架構(gòu)的層次去看整個(gè)系統(tǒng),而并非單個(gè)類(lèi)的層次。
適用性和優(yōu)缺點(diǎn)
適用性
1 .為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口。
2 .提高子系統(tǒng)的獨(dú)立性。
3 .在層次化結(jié)構(gòu)中,可以使用 Facade 模式定義系統(tǒng)中每一層的入口。
優(yōu)點(diǎn)
1. 松散耦合
外觀模式松散了客戶端與子系統(tǒng)的耦合關(guān)系,讓子系統(tǒng)內(nèi)部的模塊能更容易擴(kuò)展和維護(hù)。即要點(diǎn)2.
2. 簡(jiǎn)單易用
外觀模式讓子系統(tǒng)更加易用,客戶端不再需要了解子系統(tǒng)內(nèi)部的實(shí)現(xiàn),也不需要跟眾多子系統(tǒng)內(nèi)部的模塊進(jìn)行交互,只需要跟外觀交互就可以了,相當(dāng)于外觀類(lèi)為外部客戶端使用子系統(tǒng)提供了一站式服務(wù)。
3. 更好的劃分訪問(wèn)層次
通過(guò)合理使用
Facade
,可以幫助我們更好的劃分訪問(wèn)的層次。有些方法是對(duì)系統(tǒng)外的,有些方法是系統(tǒng)內(nèi)部使用的。把需要暴露給外部的功能集中到外觀中,這樣既方便客戶端使用,也很好的隱藏了內(nèi)部的細(xì)節(jié)。
缺點(diǎn)
過(guò)多的或者是不太合理的 Facade 也容易讓人迷惑,到底是調(diào)用 Facade 好呢,還是直接調(diào)用模塊好。
LCL_data原創(chuàng)于CSDN.NET【 http://blog.csdn.net/lcl_data/article/details/8841779 】
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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