外觀模式

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

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

其實(shí)這個(gè)模式中,沒有類與類之間的繼承關(guān)系癌压,只是進(jìn)行了簡單的類引用仰泻,統(tǒng)一了對外的接口而已√步欤看起來是不是很簡單集侯?廢話不多說了,下面簡單向大家展示一下代碼吧帜消!

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

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;

}

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

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

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

執(zhí)行這個(gè)模式,只有 LibraryAPI 來保存 PersistencyManager 和 HTTPClient 的實(shí)例拙已。之后决记,LibraryAPI 將會(huì)公開一個(gè)簡單的 API 來訪問這些服務(wù)。

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

打開 LibraryAPI.h,在頂部引入面文件:

#import "Album.h"

接下來建车,在 LibraryAPI.h下面添加如下方法:

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

- (NSArray*)getAlbums;

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

- (void)deleteAlbumAtIndex:(int)index;

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

在 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 用來判斷领斥,如果專輯列表數(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 了嚼黔。

接下來细层,在 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ì)的長處爵卒;當(dāng)一些系統(tǒng)外的類添加了一個(gè)新專輯虚缎,它不知道─也不需要知道─復(fù)雜的內(nèi)部系統(tǒng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子都许,更是在濱河造成了極大的恐慌桐臊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件创坞,死亡現(xiàn)場離奇詭異,居然都是意外死亡受葛,警方通過查閱死者的電腦和手機(jī)题涨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門偎谁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纲堵,你說我怎么就攤上這事巡雨。” “怎么了席函?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵铐望,是天一觀的道長。 經(jīng)常有香客問我茂附,道長正蛙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任营曼,我火速辦了婚禮乒验,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒂阱。我一直安慰自己徊件,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布蒜危。 她就那樣靜靜地躺著虱痕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辐赞。 梳的紋絲不亂的頭發(fā)上部翘,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音响委,去河邊找鬼新思。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赘风,可吹牛的內(nèi)容都是我干的夹囚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼邀窃,長吁一口氣:“原來是場噩夢啊……” “哼荸哟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞬捕,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鞍历,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肪虎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劣砍,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年扇救,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刑枝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片香嗓。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖装畅,靈堂內(nèi)的尸體忽然破棺而出靠娱,到底是詐尸還是另有隱情,我是刑警寧澤洁灵,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站掺出,受9級特大地震影響徽千,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汤锨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一双抽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闲礼,春花似錦牍汹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锨并,卻和暖如春露该,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背第煮。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工解幼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人包警。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓撵摆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親害晦。 傳聞我的和親對象是個(gè)殘疾皇子特铝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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