iOS設(shè)計(jì)模式(8)外觀模式

設(shè)計(jì)模式系列文章

《iOS設(shè)計(jì)模式(1)簡(jiǎn)單工廠模式》
《iOS設(shè)計(jì)模式(2)工廠模式》
《iOS設(shè)計(jì)模式(3)適配器模式》
《iOS設(shè)計(jì)模式(4)抽象工廠模式》
《iOS設(shè)計(jì)模式(5)策略模式》
《iOS設(shè)計(jì)模式(6)模板模式》
《iOS設(shè)計(jì)模式(7)建造者模式》

最近事情比較多友瘤,很長(zhǎng)時(shí)間沒(méi)有更新文章了贴妻。正好今天有時(shí)間瘪松,我們看一下設(shè)計(jì)模式之外觀模式历极。

1概念描述

“為子系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的接口。外觀模式定義了一個(gè)更高層次的接口秧了,這個(gè)接口使得這一子系統(tǒng)更加容易使用〗垂蹋” ----《設(shè)計(jì)模式》(Addison-Wesley,1994)

【注意:子系統(tǒng)可以是多個(gè)也可以是一個(gè)⊥分欤】

2.角色

(1)子系統(tǒng)類(lèi):每個(gè)子系統(tǒng)定義了相關(guān)功能和模塊的接口运悲。
(2)Facade(外觀類(lèi)):整合子系統(tǒng)中的接口,客戶(hù)端可以調(diào)用這個(gè)類(lèi)的方法髓窜。
(3)Clients(客戶(hù)端):通過(guò)外觀類(lèi)提供的接口和各個(gè)子系統(tǒng)的接口進(jìn)行交互扇苞。
參考結(jié)構(gòu)圖(來(lái)自百度百科

外觀模式結(jié)構(gòu)圖
3.適用場(chǎng)景

在以下情況下可以考慮使用外觀模式:

(1)設(shè)計(jì)初期階段,應(yīng)該有意識(shí)的將不同層分離寄纵,層與層之間建立外觀模式鳖敷。
(2)開(kāi)發(fā)階段,子系統(tǒng)越來(lái)越復(fù)雜程拭,增加外觀模式提供一個(gè)簡(jiǎn)單的調(diào)用接口定踱。
(3)維護(hù)一個(gè)大型遺留系統(tǒng)的時(shí)候,可能這個(gè)系統(tǒng)已經(jīng)非常難以維護(hù)和擴(kuò)展恃鞋,但又包含非常重要的功能崖媚,為其開(kāi)發(fā)一個(gè)外觀類(lèi),以便新系統(tǒng)與其交互恤浪。百度百科

我們看一下具體的使用場(chǎng)景吧畅哑,還記得前面文章中我們提到買(mǎi)車(chē)的事吧,今天還是拿買(mǎi)車(chē)說(shuō)事水由。前面我們選好了車(chē)荠呐,現(xiàn)在進(jìn)入到買(mǎi)車(chē)的具體流程中。你從4S店買(mǎi)一輛車(chē)砂客,幾乎要涉及到店里的每個(gè)部門(mén)泥张,比如財(cái)務(wù)部門(mén)、銷(xiāo)售部門(mén)鞠值、售后服務(wù)部門(mén)等等媚创。

那么問(wèn)題來(lái)了,我們買(mǎi)一輛車(chē)真的就需要把4S店的每個(gè)部門(mén)都跑一邊嗎彤恶?其實(shí)沒(méi)必要钞钙,我們只要跟接待自己的銷(xiāo)售服務(wù)人員溝通好就行了,剩下的事情声离,她可以幫我們做歇竟。比如說(shuō):我們只要選好付款方式,然后去交錢(qián)就完事了抵恋,并不關(guān)心財(cái)務(wù)部門(mén)內(nèi)部那些全款買(mǎi)車(chē)的流程和貸款買(mǎi)車(chē)的流程;也不用關(guān)心怎樣去銷(xiāo)售部門(mén)拿贈(zèng)品宝磨;也不用關(guān)心售后服務(wù)部門(mén)誰(shuí)來(lái)幫你做那些服務(wù)內(nèi)容弧关;這一切我們只要跟接待自己的銷(xiāo)售人員溝通就好了盅安。

這個(gè)例子中4S店的各個(gè)部門(mén)其實(shí)就類(lèi)似一個(gè)個(gè)的子系統(tǒng),而接待我們的美女銷(xiāo)售就是外觀角色世囊。下面我們看一下具體的代碼實(shí)現(xiàn)别瞭。

4.代碼實(shí)現(xiàn)

先看各個(gè)子系統(tǒng)的接口實(shí)現(xiàn)吧:
(1)LHFinance:財(cái)務(wù)部門(mén)管理:現(xiàn)金付款、申請(qǐng)貸款株憾、審核貸款蝙寨、放款等業(yè)務(wù)。

#import <Foundation/Foundation.h>

@interface LHFinance : NSObject

// 現(xiàn)金支付
- (void)cashPayment;

// 申請(qǐng)貸款
- (BOOL)applyLoan;

// 審核貸款
- (BOOL)auditLoan;

// 放款
- (BOOL)getLoad;

@end

(2)銷(xiāo)售部門(mén)管理:車(chē)輛調(diào)配嗤瞎、配件墙歪、贈(zèng)品等業(yè)務(wù)。

#import <Foundation/Foundation.h>

@interface LHSales : NSObject

// 提車(chē)
- (void)provideCar;

// 車(chē)貼膜
- (void)carFilm;

// 行車(chē)記錄儀
- (void)tachograph;

// 發(fā)動(dòng)機(jī)護(hù)板
- (void)engineGuard;

// 腳墊
- (void)mat;

@end

(3)售后服務(wù)部門(mén)管理:售前服務(wù)(貼膜贝奇、裝配件虹菲、洗車(chē)、上牌等服務(wù))和售后服務(wù)(維修掉瞳、保養(yǎng)等)

#import <Foundation/Foundation.h>

@interface LHService : NSObject

// 洗車(chē)服務(wù)
- (void)carWash;

// 上牌服務(wù)
- (void)applyPlate;

// 貼膜服務(wù)
- (void)filming;

// 安裝行車(chē)記錄儀
- (void)installTachograph;

@end

上面是我們的子系統(tǒng)接口毕源,對(duì)于客戶(hù)來(lái)說(shuō)沒(méi)必要關(guān)心這么多業(yè)務(wù),所以我們定義一個(gè)高層接口類(lèi)來(lái)統(tǒng)一各個(gè)子系統(tǒng)的接口陕习,這個(gè)類(lèi)就是我們的4S銷(xiāo)售接待人員的角色類(lèi):LHService霎褐。

#import <Foundation/Foundation.h>

@interface LH4SWaiter : NSObject

- (void)buyCarWithCash;// 現(xiàn)金買(mǎi)車(chē)

- (void)buyCarWithLoad;// 貸款買(mǎi)車(chē)

@end

#import "LH4SWaiter.h"
#import "LHFinance.h"
#import "LHSales.h"
#import "LHService.h"

@interface LH4SWaiter ()
{
    LHFinance   *finance;// 財(cái)務(wù)部門(mén)
    LHSales     *sales;// 銷(xiāo)售部門(mén)
    LHService   *service;// 售后服務(wù)部門(mén)
}
@end

@implementation LH4SWaiter

- (instancetype)init
{
    self = [super init];
    if (self) {
        finance = [[LHFinance alloc] init];
        sales = [[LHSales alloc] init];
        service = [[LHService alloc] init];
    }
    return self;
}

// 現(xiàn)金買(mǎi)車(chē)
- (void)buyCarWithCash{
    // 現(xiàn)金支付
    [finance cashPayment];
    
    // 贈(zèng)送禮品
    [self gift];
    
    // 提供服務(wù)
    [self service];
}

// 貸款買(mǎi)車(chē)
- (void)buyCarWithLoad{
    
    BOOL _isSuccess = [finance applyLoan];
    
    // 如果貸款審批下來(lái),則提車(chē)该镣、送贈(zèng)品和服務(wù)
    if (_isSuccess) {
        [sales provideCar];
        [self gift];
        [self service];
    }else{
        NSLog(@"貸款審批未通過(guò)冻璃!");
    }
}

// 贈(zèng)品
- (void)gift{
    NSLog(@"贈(zèng)品有:");
    [sales carFilm];
    [sales tachograph];
    [sales engineGuard];
    [sales mat];
}

// 服務(wù)
- (void)service{
    NSLog(@"售后服務(wù):");
    [service carWash];
    [service applyPlate];
    [service filming];
    [service installTachograph];
}

@end

這樣客戶(hù)只要告訴她我是現(xiàn)金支付還是貸款支付,剩余的事情她全部幫你做了拌牲,比如貸款的話俱饿,貸款的申請(qǐng)、審核塌忽、放款等拍埠。再比如哪些贈(zèng)品,哪些服務(wù)她都幫你安排好土居。

客戶(hù)端只要簡(jiǎn)單調(diào)用就可以了:

#import "ViewController.h"
#import "LH4SWaiter.h"

@interface ViewController ()
{
    LH4SWaiter *_waiter;
}
@end

@implementation ViewController

#pragma mark -
#pragma mark System Method

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _waiter = [[LH4SWaiter alloc] init];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

#pragma mark -
#pragma mark Button Event

// 現(xiàn)金買(mǎi)車(chē)
- (IBAction)btnCashEvent:(UIButton *)sender {
    [_waiter buyCarWithCash];
}

// 貸款買(mǎi)車(chē)
- (IBAction)btnLoanEvent:(UIButton *)sender {
    [_waiter buyCarWithLoad];
}

@end

下面是輸出結(jié)果:

E680293F-71BF-4569-98F8-E5259D97F1BC.png
5.優(yōu)點(diǎn)

1.使用外觀模式可以使項(xiàng)目更好的分層亏镰,增強(qiáng)了代碼的擴(kuò)展性。
2.客戶(hù)端屏蔽了子系統(tǒng)組件允睹,使客戶(hù)端和子系統(tǒng)之間實(shí)現(xiàn)了松耦合關(guān)系榕酒。

源碼下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眷蜓,隨后出現(xiàn)的幾起案子分瘾,更是在濱河造成了極大的恐慌,老刑警劉巖吁系,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件德召,死亡現(xiàn)場(chǎng)離奇詭異白魂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)上岗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)福荸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肴掷,你說(shuō)我怎么就攤上這事敬锐。” “怎么了呆瞻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵台夺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我栋烤,道長(zhǎng)谒养,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任明郭,我火速辦了婚禮买窟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薯定。我一直安慰自己始绍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布话侄。 她就那樣靜靜地躺著亏推,像睡著了一般。 火紅的嫁衣襯著肌膚如雪年堆。 梳的紋絲不亂的頭發(fā)上吞杭,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音变丧,去河邊找鬼芽狗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛痒蓬,可吹牛的內(nèi)容都是我干的童擎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼攻晒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼顾复!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鲁捏,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芯砸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乙嘀,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡末购,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虎谢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曹质,死狀恐怖婴噩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羽德,我是刑警寧澤几莽,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站宅静,受9級(jí)特大地震影響章蚣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姨夹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一纤垂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧磷账,春花似錦峭沦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绰咽,卻和暖如春菇肃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背取募。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工琐谤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矛辕。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓笑跛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親聊品。 傳聞我的和親對(duì)象是個(gè)殘疾皇子飞蹂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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