外觀模式

Objective-C編程之道 iOS設(shè)計(jì)模式解析
iOS設(shè)計(jì)模式解析-工廠模式
iOS設(shè)計(jì)模式解析-抽象工廠模式
iOS設(shè)計(jì)模式解析-外觀模式
iOS設(shè)計(jì)模式解析-中介者模式
iOS設(shè)計(jì)模式解析-觀察者模式
iOS設(shè)計(jì)模式解析-裝飾模式
iOS設(shè)計(jì)模式解析-責(zé)任鏈模式
iOS設(shè)計(jì)模式解析-模板方法
iOS設(shè)計(jì)模式解析-策略模式
iOS設(shè)計(jì)模式解析-享元模式
iOS設(shè)計(jì)模式解析-代碼地址

何為外觀模式

外觀模式為子系統(tǒng)中一組不同的接口提供統(tǒng)一的接口。外觀定義了上層接口,通過(guò)降低復(fù)雜度和隱藏子系統(tǒng)間的通信及依存關(guān)系雌芽,讓子系統(tǒng)更易于使用。

外觀模式:為系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的接口,外觀定義一個(gè)高層接口秋麸,讓子系統(tǒng)更易于使用心傀。

何時(shí)使用外觀模式

在以下情形,自然會(huì)考慮使用這一模式杖刷。

  • 子系統(tǒng)正逐漸變得復(fù)雜励饵。應(yīng)用模式的過(guò)程中演化出許多類』迹可以使用外觀為這些子系統(tǒng)類提供一個(gè)較簡(jiǎn)單的接口役听。
  • 可以使用外觀對(duì)子系統(tǒng)進(jìn)行分層。每個(gè)子系統(tǒng)級(jí)別有一個(gè)外觀作為入口點(diǎn)表窘。讓他們通過(guò)其外觀進(jìn)行通信典予,可以簡(jiǎn)化它們的依賴關(guān)系

下面將用出租車司機(jī)的例子實(shí)現(xiàn)外觀模式,以闡述其基本概念乐严。


image.png
Car
#import <Foundation/Foundation.h>

@interface Car : NSObject

- (void) releaseBrakes;
- (void) changeGears;
- (void) pressAccelerator;
- (void) pressBrakes;
- (void) releaseAccelerator;

@end
#import "Car.h"

@implementation Car

- (void) releaseBrakes
{
    
}

- (void) changeGears
{
    
}

- (void) pressAccelerator
{
    
}

- (void) pressBrakes
{
    
}

- (void) releaseAccelerator
{
    
}

@end

Car定義了幾個(gè)操作內(nèi)部對(duì)象用的方法瘤袖,如releaseBrakes(松剎車)、changeGears(換擋)昂验、pressAccelerator(踩油門)捂敌、pressBrakes(踩剎車)和releaseAccelerator(松油門)〖惹伲客戶端要想使用Car的內(nèi)部對(duì)象占婉,必須了解如何使用這些方法進(jìn)行操作

Taximeter
#import <Foundation/Foundation.h>

@interface Taximeter : NSObject

- (void) start;
- (void) stop;

@end
#import "Taximeter.h"

@implementation Taximeter

- (void) start
{
    
}

- (void) stop
{
    
}

@end

雖然Taximeter本身是個(gè)復(fù)雜系統(tǒng),但它有兩個(gè)讓客戶端操作其對(duì)象的方法甫恩。startstop方法只是讓Taximeter開始或停止逆济。目前,出租車服務(wù)系統(tǒng)里面有兩個(gè)復(fù)雜的子系統(tǒng)。需要一個(gè)CabDriver(出租車司機(jī))作為“外觀”以簡(jiǎn)化接口奖慌。

CabDriver
#import <Foundation/Foundation.h>
#import "Car.h"
#import "Taximeter.h"
#import <UIKit/UIKit.h>

@interface CabDriver : NSObject

- (void) driveToLocation:(CGPoint) x;

@end
#import "CabDriver.h"

@implementation CabDriver

- (void) driveToLocation:(CGPoint) x
{
    // ...
    
    // set off the taximeter
    Taximeter *meter = [[Taximeter alloc] init];
    [meter start];
    
    // operate the vehicle
    // until location x is reached
    Car *car = [[Car alloc] init];
    [car releaseBrakes];
    [car changeGears];
    [car pressAccelerator];
    
    // ...
    
    // when it's reached location x
    // then stop the car and taximeter
    [car releaseAccelerator];
    [car pressBrakes];
    [meter stop];
    
    // ...
}

@end

driveToLocation:方法中抛虫,首先啟動(dòng)一個(gè)Taximeter(計(jì)價(jià)器)對(duì)象,讓它從那一刻開始計(jì)價(jià)简僧。然后轉(zhuǎn)到Car(汽車)對(duì)象建椰,開始對(duì)它進(jìn)行操作。最后讓Taximeter(計(jì)價(jià)器)對(duì)象停止計(jì)價(jià)涎劈。這樣服務(wù)就結(jié)束了广凸。

總結(jié):當(dāng)程序逐漸變大變復(fù)雜時(shí),會(huì)有越來(lái)越多小型的類從設(shè)計(jì)和應(yīng)用模式中演化而來(lái)蛛枚。如果沒(méi)有一種簡(jiǎn)化的方法來(lái)使用這些類谅海,客戶端代碼最終將變得越來(lái)越大、越來(lái)越難以理解蹦浦,而且扭吁,維護(hù)起來(lái)會(huì)繁瑣無(wú)趣。外觀有助于提供一種更為簡(jiǎn)潔的方式來(lái)使用子系統(tǒng)中的這些類盲镶。處理這些子系統(tǒng)類的默認(rèn)行為的侥袜,可能只是定義在外觀中的一個(gè)簡(jiǎn)單的方法,而不必直接去使用這些類溉贿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枫吧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子宇色,更是在濱河造成了極大的恐慌九杂,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宣蠕,死亡現(xiàn)場(chǎng)離奇詭異例隆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)抢蚀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門镀层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人皿曲,你說(shuō)我怎么就攤上這事唱逢。” “怎么了屋休?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵坞古,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我博投,道長(zhǎng),這世上最難降的妖魔是什么盯蝴? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任抹估,我火速辦了婚禮孕豹,結(jié)果婚禮上废累,老公的妹妹穿的比我還像新娘。我一直安慰自己尿瞭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布翅睛。 她就那樣靜靜地躺著声搁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捕发。 梳的紋絲不亂的頭發(fā)上疏旨,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音扎酷,去河邊找鬼檐涝。 笑死,一個(gè)胖子當(dāng)著我的面吹牛法挨,可吹牛的內(nèi)容都是我干的谁榜。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼凡纳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窃植!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起荐糜,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巷怜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后狞尔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丛版,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年偏序,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了页畦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡研儒,死狀恐怖豫缨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情端朵,我是刑警寧澤好芭,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站冲呢,受9級(jí)特大地震影響舍败,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一邻薯、第九天 我趴在偏房一處隱蔽的房頂上張望裙戏。 院中可真熱鬧,春花似錦厕诡、人聲如沸累榜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)壹罚。三九已至,卻和暖如春寿羞,著一層夾襖步出監(jiān)牢的瞬間猖凛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工稠曼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留形病,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓霞幅,卻偏偏與公主長(zhǎng)得像漠吻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子司恳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容