發(fā)文章
發(fā)文工具
撰寫
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
在項目開發(fā)中,有時候會遇到這樣的一種情景:已有系統(tǒng)的各個子系統(tǒng)之間,隨著業(yè)務(wù)需求的發(fā)展,有了比較緊湊的耦合關(guān)系。現(xiàn)在需要利用這些子系統(tǒng)的功能,為移動端提供業(yè)務(wù)處理。我們該怎么應(yīng)對這樣的業(yè)務(wù)需求呢?這就是本章外觀模式所要解決的問題。
進(jìn)入正式講解前,我們先來分析一下兩種應(yīng)對如上業(yè)務(wù)需求的方式:
方式一:移動端直接調(diào)用各個子系統(tǒng)的功能,和各個子系統(tǒng)之間形成緊耦合的關(guān)系,如下圖所示:
方式二:提供一個高層接口,該高層接口負(fù)責(zé)和子系統(tǒng)進(jìn)行交互,并向移動端提供需要使用的接口,如下圖所示:
從上面兩種方式的圖式結(jié)構(gòu)可以看到,對移動端來說,方式二比方式一要好用很多,因為在方式二中,移動端不需要知道各個子系統(tǒng)的邏輯,只需要和高層接口交互就可以了。實際上方式二,就是我們這里要說的外觀模式了。
“為子系統(tǒng)中的一組接口提供一個統(tǒng)一的接口。外觀模式定義了一個更高層次的接口,這個接口使得這一子系統(tǒng)更加容易使用?!?/strong>
最初的定義出現(xiàn)于《設(shè)計模式》(Addison-Wesley,1994)。
這個定義,通過上面引言的圖示講解,應(yīng)該很好理解了,這里再分析一下定義中的兩個重要角色:
外觀角色:就是引言圖示中的“高層接口”,客戶端可以調(diào)用這個角色的方法;另外,該角色知道相關(guān)的子系統(tǒng)的功能和責(zé)任。
子系統(tǒng)角色:可以同時有一個或者多個子系統(tǒng)。每一個子系統(tǒng)都不是一個單獨的類,而是一個類的集合。每一個子系統(tǒng)都可以被客戶端直接調(diào)用,或者被外觀角色調(diào)用。
生活中,應(yīng)用外觀模式的例子很多,比如去飯館吃飯,我們不需要關(guān)注菜的選料、烹調(diào)等過程,只需要和服務(wù)員進(jìn)行交互:服務(wù)員給我們菜譜(相當(dāng)于就是外觀模式的高級接口),我們選菜(調(diào)用接口),就可以享受美食。
這里,我們用另一個生活中的例子來進(jìn)行解說。不知道大家有沒有通過旅行社報團出去旅游的經(jīng)歷?這是一個很好的外觀模式的應(yīng)用。我們選擇好景點之后,旅行社會幫我們聯(lián)系大巴、旅館、飯店、景點門票以及景點服務(wù)等事情,這些事情我們都不需要親自去安排,這就是外觀模式的便利之處:可以使得客戶端的接口更簡單。
下面列出應(yīng)用外觀模式實現(xiàn)旅行社報團旅游的結(jié)構(gòu)圖:
如果不應(yīng)用外觀模式,我們(上圖中的Client),就得自己去聯(lián)系交通工具、預(yù)定旅館、飯館、景點門票等,相信這樣的旅程,大家會感覺很累。有了外觀角色(上圖中的Facade),它會幫我們?nèi)ヌ幚磉@些事情。完整代碼大家可以下載查看,這里只貼出部分源碼。
Facade.m(部分源碼):
1 - (id)init 2 { 3 self = [super init]; 4 if (self != nil) 5 { 6 _transportation = [[Transportation alloc] init]; 7 _hotel = [[Hotel alloc] init]; 8 _restaurant = [[Restaurant alloc] init]; 9 _attractions = [[Attractions alloc] init]; 10 } 11 return self; 12 } 13 14 - (void)travel 15 { 16 [_transportation selTransportation]; 17 [_hotel selHotel]; 18 [_restaurant selRestaurant]; 19 [_attractions selAttractions]; 20 } 21 22 - (void)dealloc 23 { 24 [_transportation release]; 25 [_hotel release]; 26 [_restaurant release]; 27 [_attractions release]; 28 29 [super dealloc]; 30 }
從源碼可以看到,外觀類調(diào)用了交通工具類、旅館類、飯館類、景點類。下面看看客戶端調(diào)用代碼:
1 Facade *facade = [[Facade alloc] init]; 2 [facade travel]; 3 [facade release];
客戶端代碼只需要和外觀類進(jìn)行交互。
下載源碼
通過上面的講解,我們來分析一下外觀模式的特點:
根據(jù)外觀模式的特點,我們可以在以下情況中使用Facade模式:
返回目錄
來自: 昵稱10504424 > 《工作》
0條評論
發(fā)表
請遵守用戶 評論公約
PHP設(shè)計模式—外觀模式
外觀模式(Facade):又叫門面模式,為子系統(tǒng)中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。子系統(tǒng)方法一子系統(tǒng)方法二子系統(tǒng)方法三子系統(tǒng)方法四 總...
Java設(shè)計模式-外觀(門面)模式
優(yōu)點:減少了系統(tǒng)的依賴.系統(tǒng)只依賴于被門面模式封裝好的高級接口,而不依賴于子系統(tǒng)的內(nèi)部接口.提高靈活性.子系統(tǒng)內(nèi)部的改變,不會對門面對象產(chǎn)生影響.提高安全性.將子系統(tǒng)內(nèi)部的實現(xiàn)透明化..fa...
GoF設(shè)計模式之十 Facade- -
B5) Facade(外觀模式) 定義:提供一個統(tǒng)一的連接子系統(tǒng)中一套接口的接口。代碼實現(xiàn)有點類似建造者模式,區(qū)別在于,建造者模式目的在于以相同的構(gòu)建過程通過不同的建造者得到不同的結(jié)果,而外觀模...
深入理解JavaScript系列(30):設(shè)計模式之外觀模式
深入理解JavaScript系列(30):設(shè)計模式之外觀模式介紹。var addMyEvent = function (el, ev, fn) { if (el.addEventListener) { el.addEventListener(ev, fn, false);第三,在維護一個遺留的大型系統(tǒng)...
Java 設(shè)計模式——外觀模式
Java 設(shè)計模式——外觀模式概述。StockA.java.StockA stockA = new StockA();StockB stockB = new StockB();private StockA stockA = nu...
C#面向?qū)ο笤O(shè)計模式縱橫談:Facade 外觀模式
C#面向?qū)ο笤O(shè)計模式縱橫談:Facade 外觀模式C#面向?qū)ο笤O(shè)計模式縱橫談:Facade 外觀模式。為子系統(tǒng)中的一組接口提供一個一致的界面,F(xiàn)ac...
設(shè)計模式【六】—— 裝飾者模式/組合模式/外觀模式
設(shè)計模式【六】—— 裝飾者模式/組合模式/外觀模式第八章 裝飾者模式8.1 定義。9.2 角色及職責(zé)Component:這是組合中對象聲明接口,在適當(dāng)情況下,實現(xiàn)所有類共有的接口默認(rèn)行為,用于訪問和管理 Compo...
C#設(shè)計模式(11)——外觀模式(Facade Pattern)
介紹了外觀模式的定義之后,讓我們具體看看外觀模式的由來以及實現(xiàn),下面與學(xué)校中一個選課系統(tǒng)為例來解釋外觀模式,例如在選課系統(tǒng)中,...
深入淺出外觀模式(一)
外觀模式是一種使用頻率非常高的結(jié)構(gòu)型設(shè)計模式,它通過引入一個外觀角色來簡化客戶端與子系統(tǒng)之間的交互,為復(fù)雜的子系統(tǒng)調(diào)用提供一個...
微信掃碼,在手機上查看選中內(nèi)容