外观模式:提供一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层的接口,让子系统更容易使用。
外观模式是结构性模式之一,其的意图很清晰,也就是通过简单的接口将复杂的逻辑封装起来,便于访问。如果理解了意图,那这个设计模式就很容易理解了。
没啥好说的,这是一个简单的模式,直接举栗子
我们去河边钓鱼,首先我们需要清理一片场地,摆放支架,组装鱼竿,再绑上线和鱼漂,挂上鱼饵,撒上饵料,等等一些复杂的过程。
如果是一个新手,这么复杂的步骤,肯定就知难而退了。假如我们家里有矿(虽然实际没有,但是不能缺乏想象),我们是否可以找一个人来替我们做这个事情?
这个人把原本属于我们的事情都做了,最后鱼竿递给我们,我们就可以直接钓鱼了。这里外观模式模式就是扮演着那个为我们服务的角色。他会处理好所有我们期望它处理的复杂任务,只暴露出一个简单接口出来就完了。这样不管会钓鱼的还是不会钓鱼的,都能很轻松的享受到钓鱼的乐趣。
这是外观的实现
#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
具体调用,子系统的逻辑这里并不提供,具体情况需要具体分析
#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];
//用外观模式将子系统中的内容封装起来,便于访问。
FishingFacade * faced = [[FishingFacade alloc] initWithPlayground:playground pool:pool hook:hook line:line rod:rod bait:bait feed:feed];
//在外观模式中我们只需要调用外观类的方法就好了,不需要管子系统怎么实现。
[faced goFishing];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1800 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[faced goback];
});
}
return 0;
}
优点
减少了系统之间的相互依赖
增加了灵活性
隐藏了子系统的实现
缺点
子系统修改会导致外观类需要修改,违背了开闭原则