外觀模式

外觀模式(Facade),為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,此模式定義 一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。

下面給大家展示一下類的結(jié)構(gòu)圖,想必大家一看就明白了:

其實(shí)這個(gè)模式中,沒(méi)有類與類之間的繼承關(guān)系,只是進(jìn)行了簡(jiǎn)單的類引用,統(tǒng)一了對(duì)外的接口而已??雌饋?lái)是不是很簡(jiǎn)單?廢話不多說(shuō)了,下面簡(jiǎn)單向大家展示一下代碼吧!

注意:本文所有代碼均在ARC環(huán)境下編譯通過(guò)。

SubSystemOne類接口

復(fù)制代碼代碼如下:

#import

@interface SubSystemOne:NSObject

-(void)MethodOne;

@end

SubSystemOne類實(shí)現(xiàn)

復(fù)制代碼代碼如下:

#import "SubSystemOne.h"

@implementation SubSystemOne

-(void)MethodOne{

NSLog(@"子系統(tǒng)方法一");

}

@end

SubSystemTwo類接口

復(fù)制代碼代碼如下:

#import

@interface SubSystemTwo:NSObject

-(void)MethodTwo;

@end

SubSystemTwo類實(shí)現(xiàn)

復(fù)制代碼代碼如下:

#import "SubSystemTwo.h"

@implementation SubSystemTwo

-(void)MethodTwo{

NSLog(@"子系統(tǒng)方法二");

}

@end

SubSystemThree類接口

復(fù)制代碼代碼如下:

#import

@interface SubSystemThree:NSObject

-(void)MethodThree;

@end

SubSystemThree類實(shí)現(xiàn)

復(fù)制代碼代碼如下:

#import "SubSystemThree.h"

@implementation SubSystemThree

-(void)MethodThree{

NSLog(@"子系統(tǒng)方法三");

}

@end

SubSystemFour類接口

復(fù)制代碼代碼如下:

#import

@interface SubSystemFour:NSObject

-(void)MethodFour;

@end

SubSystemFour類實(shí)現(xiàn)

復(fù)制代碼代碼如下:

#import "SubSystemFour.h"

@implementation SubSystemFour

-(void)MethodFour{

NSLog(@"子系統(tǒng)方法四");

}

@end

Facade類接口

復(fù)制代碼代碼如下:

#import

@class SubSystemOne;//此處@class關(guān)鍵字的作用是聲明(不是定義哦)所引用的類

@class SubSystemTwo;

@class SubSystemThree;

@class SubSystemFour;

@interface Facade :NSObject{

@private SubSystemOne *one;

@private SubSystemTwo *two;

@private SubSystemThree *three;

@private SubSystemFour *four;

}

-(Facade*)MyInit;

-(void)MethodA;

-(void)MethodB;

@end

Facade類實(shí)現(xiàn)

復(fù)制代碼代碼如下:

#import "Facade.h"

#import "SubSystemOne.h"

#import "SubSystemTwo.h"

#import "SubSystemThree.h"

#import "SubSystemFour.h"

@implementation Facade

-(Facade*)MyInit{

one= [[SubSystemOne alloc]init];

two= [[SubSystemTwo alloc]init];

three= [[SubSystemThree alloc]init];

four= [[SubSystemFour alloc]init];

return self;

}

-(void)MethodA{

NSLog(@"\n方法組A() ---- ");

[one MethodOne];

[two MethodTwo];

[three MethodThree];

[four MethodFour];

}

-(void)MethodB{

NSLog(@"\n方法組B() ---- ");

[two MethodTwo];

[three MethodThree];

}

@end

Main()方法調(diào)用

復(fù)制代碼代碼如下:

#import

#import "Facade.h"

int main (int argc,const char * argv[])

{

@autoreleasepool{

Facade *facade = [[Facade alloc]MyInit];

[facade MethodA];

[facade MethodB];

}

return 0;

}

在開(kāi)發(fā)軟件時(shí)候,考慮使用外觀模式的情況一般分為三種情況。第一種情況,設(shè)計(jì)初始階段,應(yīng)該要有意識(shí)的將不同的兩個(gè)分層分離,層與層之間建立外觀Facade,這樣可以為復(fù)雜的子系統(tǒng)提供一個(gè)簡(jiǎn)單的接口,使得耦合大大降低。第二種情況,在開(kāi)發(fā)階段子系統(tǒng)往往因?yàn)椴粩嗟闹貥?gòu)演化而變得越來(lái)越復(fù)雜,增加外觀Facade可以提供一個(gè)簡(jiǎn)單的接口,減少它們之間的依賴。第三種情況,在維護(hù)一個(gè)遺留的大型系統(tǒng)時(shí),可能這個(gè)系統(tǒng)已經(jīng)非常難以維護(hù)和擴(kuò)展了,如果有新的需求,那么可以為新系統(tǒng)開(kāi)發(fā)一個(gè)外觀Facade類,來(lái)提供設(shè)計(jì)粗糙或高度復(fù)雜的遺留代碼的比較清晰簡(jiǎn)單的接口,讓新系統(tǒng)與Facade對(duì)象交互,F(xiàn)acade與遺留代碼交互所有復(fù)雜的工作,這樣可以保持較低的耦合度。

實(shí)例進(jìn)階

目前你有 PersistencyManager 來(lái)在本地存儲(chǔ)專輯數(shù)據(jù),HTTPClient 處理遠(yuǎn)程通信。項(xiàng)目中其它的類跟這些邏輯都沒(méi)關(guān)。

執(zhí)行這個(gè)模式,只有 LibraryAPI 來(lái)保存 PersistencyManager 和 HTTPClient 的實(shí)例。之后,LibraryAPI 將會(huì)公開(kāi)一個(gè)簡(jiǎn)單的 API 來(lái)訪問(wèn)這些服務(wù)。

LibraryAPI 將會(huì)公開(kāi)給其它代碼,但是它隱藏了 APP 中 HTTPClient 和 PersistencyManager 的復(fù)雜部分。

打開(kāi) LibraryAPI.h,在頂部引入面文件:

#import "Album.h"

接下來(lái),在 LibraryAPI.h下面添加如下方法:

復(fù)制代碼代碼如下:

- (NSArray*)getAlbums;

- (void)addAlbum:(Album*)album atIndex:(int)index;

- (void)deleteAlbumAtIndex:(int)index;

現(xiàn)在,這些方法都公開(kāi)給了其它類。

在 LibraryAPI.m 文件引入如下兩個(gè)文件:

#import "PersistencyManager.h"

#import "HTTPClient.h"

只有在這個(gè)地方你才會(huì)需要引入這些類。記?。耗愕?API 將會(huì)是你「復(fù)雜」系統(tǒng)的唯一的接入點(diǎn)。

現(xiàn)在添加一些私有屬性在你的類的擴(kuò)展里(在 @implementation 上面)

復(fù)制代碼代碼如下:

@interface LibraryAPI () {

PersistencyManager *persistencyManager;

HTTPClient *httpClient;

BOOL isOnline;

}

@end

isOnline 用來(lái)判斷,如果專輯列表數(shù)據(jù)發(fā)生變化是否能夠更新到服務(wù)器,例如添加或者刪除專輯。

你現(xiàn)在需要在 init 方法中初始化這些變量,在 LibraryAPI.m 中添加下面代碼:

復(fù)制代碼代碼如下:

- (id)init

{

self = [super init];

if (self) {

persistencyManager = [[PersistencyManager alloc] init];

httpClient = [[HTTPClient alloc] init];

isOnline = NO;

}

return self;

}

這個(gè) HTTP 客戶端在這里并不真正的工作,它只是在外觀設(shè)計(jì)里面起一個(gè)示范用法的作用,所以 isOnline 永遠(yuǎn)是 NO 了。

接下來(lái),在 LibraryAPI.m 里面添加下面三個(gè)方法:

復(fù)制代碼代碼如下:

- (NSArray*)getAlbums

{

return [persistencyManager getAlbums];

}

- (void)addAlbum:(Album*)album atIndex:(int)index

{

[persistencyManager addAlbum:album atIndex:index];

if (isOnline)

{

[httpClient postRequest:@"/api/addAlbum" body:[album description]];

}

}

- (void)deleteAlbumAtIndex:(int)index

{

[persistencyManager deleteAlbumAtIndex:index];

if (isOnline)

{

[httpClient postRequest:@"/api/deleteAlbum" body:[@(index) description]];

}

}

看一下 addAlbum:atIndex:。這個(gè)類首先更新本地?cái)?shù)據(jù),如果聯(lián)網(wǎng),它再更新遠(yuǎn)端服務(wù)器。這就是外觀設(shè)計(jì)的長(zhǎng)處;當(dāng)一些系統(tǒng)外的類添加了一個(gè)新專輯,它不知道─也不需要知道─復(fù)雜的內(nèi)部系統(tǒng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 場(chǎng)景問(wèn)題# 1.1 生活中的示例## 外觀模式在現(xiàn)實(shí)生活中的示例很多,比如:組裝電腦,通常會(huì)有兩種方案。 一個(gè)...
    七寸知架構(gòu)閱讀 6,477評(píng)論 7 57
  • 文摘一:有些地方外觀模式也被叫做門面模式,英文即Facade Pattern,提前說(shuō)明一下。 試想這種情況,用戶添...
    _淺墨_閱讀 588評(píng)論 0 1
  • 文章轉(zhuǎn)自iOS設(shè)計(jì)模式:外觀模式 基本概念 外觀模式:為子系統(tǒng)的一組接口提供一個(gè)一致的界面,此模式定義一個(gè)高層接口...
    傻傻小蘿卜閱讀 383評(píng)論 0 1
  • 定義 門面模式是對(duì)象的結(jié)構(gòu)模式,外部與一個(gè)子系統(tǒng)的通信必須通過(guò)一個(gè)統(tǒng)一的門面對(duì)象進(jìn)行。門面模式提供一個(gè)高層次的接口...
    步積閱讀 2,309評(píng)論 0 3
  • 目錄 本文的結(jié)構(gòu)如下: 什么是外觀模式 模式的結(jié)構(gòu) 代碼示例 優(yōu)點(diǎn)和缺點(diǎn) 適用環(huán)境 模式應(yīng)用 模式擴(kuò)展 補(bǔ)充 一、...
    w1992wishes閱讀 688評(píng)論 0 1

友情鏈接更多精彩內(nèi)容