外觀模式:提供一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀模式定義了一個高層的接口,讓子系統(tǒng)更容易使用。
外觀模式是結(jié)構性模式之一,其的意圖很清晰,也就是通過簡單的接口將復雜的邏輯封裝起來,便于訪問。如果理解了意圖,那這個設計模式就很容易理解了。

外觀模式
沒啥好說的,這是一個簡單的模式,直接舉栗子
我們?nèi)ズ舆呩烎~,首先我們需要清理一片場地,擺放支架,組裝魚竿,再綁上線和魚漂,掛上魚餌,撒上餌料,等等一些復雜的過程。
如果是一個新手,這么復雜的步驟,肯定就知難而退了。假如我們家里有礦(雖然實際沒有,但是不能缺乏想象),我們是否可以找一個人來替我們做這個事情?
這個人把原本屬于我們的事情都做了,最后魚竿遞給我們,我們就可以直接釣魚了。這里外觀模式模式就是扮演著那個為我們服務的角色。他會處理好所有我們期望它處理的復雜任務,只暴露出一個簡單接口出來就完了。這樣不管會釣魚的還是不會釣魚的,都能很輕松的享受到釣魚的樂趣。
這是外觀的實現(xiàn)
#import "FishingFacade.h"
@interface FishingFacade ()
@property (nonatomic ,strong) PlayGround * playground;
@property (nonatomic, strong) Pool * pool;
@property (nonatomic, strong) Hook * hook;
@property (nonatomic, strong) RedLine * line;
@property (nonatomic, strong) Rod * rod;
@property (nonatomic, strong) Bait * bait;
@property (nonatomic, strong) Feed * feed;
@end
@implementation FishingFacade
-(instancetype)initWithPlayground:(PlayGround *)playground pool:(Pool *)pool hook:(Hook *)hook line:(RedLine *)line rod:(Rod *)rod bait:(Bait *)bait feed:(Feed *)feed {
if (self = [super init]) {
_playground = playground;
_pool = pool;
_hook = hook;
_line = line;
_rod = rod;
_bait = bait;
_feed = feed;
}return self;
}
-(void)goFishing {
[_playground clean];
[_feed makeFeed];
[_hook takeHook];
[_line peelLine];
[_rod openRod];
[_rod handRodWithLine];
[_pool preapre];
}
-(void)goback {
[_playground clean];
//h回收line
//回收魚竿
//回收魚餌
//....
}
@end
具體調(diào)用,子系統(tǒng)的邏輯這里并不提供,具體情況需要具體分析
#import <Foundation/Foundation.h>
#import "FishingFacade.h"
#import "PlayGround.h"
#import "Pool.h"
#import "Hook.h"
#import "RedLine.h"
#import "Rod.h"
#import "Bait.h"
#import "Feed.h"
//外觀模式
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
PlayGround *playground = [[PlayGround alloc] init];
Pool *pool = [[Pool alloc] init];
Hook *hook = [[Hook alloc] init];
RedLine * line = [[RedLine alloc] init];
Rod * rod = [[Rod alloc] init];
Bait * bait = [[Bait alloc] init];
Feed * feed = [[Feed alloc] init];
//用外觀模式將子系統(tǒng)中的內(nèi)容封裝起來,便于訪問。
FishingFacade * faced = [[FishingFacade alloc] initWithPlayground:playground pool:pool hook:hook line:line rod:rod bait:bait feed:feed];
//在外觀模式中我們只需要調(diào)用外觀類的方法就好了,不需要管子系統(tǒng)怎么實現(xiàn)。
[faced goFishing];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1800 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[faced goback];
});
}
return 0;
}
優(yōu)點
減少了系統(tǒng)之間的相互依賴
增加了靈活性
隱藏了子系統(tǒng)的實現(xiàn)
缺點
子系統(tǒng)修改會導致外觀類需要修改,違背了開閉原則