美文网首页
外观模式(Faced Pattern)

外观模式(Faced Pattern)

作者: iOS_学渣 | 来源:发表于2019-12-02 09:41 被阅读0次

外观模式:提供一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层的接口,让子系统更容易使用。

外观模式是结构性模式之一,其的意图很清晰,也就是通过简单的接口将复杂的逻辑封装起来,便于访问。如果理解了意图,那这个设计模式就很容易理解了。

外观模式

没啥好说的,这是一个简单的模式,直接举栗子

我们去河边钓鱼,首先我们需要清理一片场地,摆放支架,组装鱼竿,再绑上线和鱼漂,挂上鱼饵,撒上饵料,等等一些复杂的过程。

如果是一个新手,这么复杂的步骤,肯定就知难而退了。假如我们家里有矿(虽然实际没有,但是不能缺乏想象),我们是否可以找一个人来替我们做这个事情?
这个人把原本属于我们的事情都做了,最后鱼竿递给我们,我们就可以直接钓鱼了。这里外观模式模式就是扮演着那个为我们服务的角色。他会处理好所有我们期望它处理的复杂任务,只暴露出一个简单接口出来就完了。这样不管会钓鱼的还是不会钓鱼的,都能很轻松的享受到钓鱼的乐趣。

这是外观的实现

#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;
}

优点

减少了系统之间的相互依赖
增加了灵活性
隐藏了子系统的实现

缺点

子系统修改会导致外观类需要修改,违背了开闭原则

相关文章

网友评论

      本文标题:外观模式(Faced Pattern)

      本文链接:https://www.haomeiwen.com/subject/uuuowctx.html