外觀模式(Faced Pattern)

外觀模式:提供一個統(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)修改會導致外觀類需要修改,違背了開閉原則

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

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