iOS設計模式之(七)外觀模式(門面模式、過程模式)

本文首發於我的博客html

前言

什麼是外觀模式

外觀模式 屬於結構型模式,在菜鳥教程中的定義以下git

外觀模式(Facade Pattern)隱藏系統的複雜性,並向客戶端提供了一個客戶端能夠訪問系統的接口。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的複雜性。github

這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法的委託調用。設計模式

模式結構

介紹

意圖:爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。xcode

主要解決:

下降訪問複雜系統的內部子系統時的複雜度,簡化客戶端與之的接口。bash

什麼時候使用:

  • 客戶端不須要知道系統內部的複雜聯繫,整個系統只需提供一個"接待員"便可。
  • 定義系統的入口。

如何解決:

客戶端不與系統耦合,外觀類與系統耦合。微信

關鍵代碼:

在客戶端和複雜系統之間再加一層,這一層將調用順序、依賴關係等處理好。ui

應用實例:

  • 去醫院看病,可能要去掛號、門診、劃價、取藥,讓患者或患者家眷以爲很複雜,若是有提供接待人員,只讓接待人員來處理,就很方便。
  • JAVA 的三層開發模式。

使用場景:

  • 爲複雜的模塊或子系統提供外界訪問的模塊。
  • 子系統相對獨立。
  • 預防低水平人員帶來的風險。

注意事項:

在層次化結構中,可使用外觀模式定義系統中每一層的入口。atom

代碼

場景

天天到公司開電腦,下班離開公司關電腦。而每次開電腦以後,都要打開Xcode、微信、QQ等等。而每次關電腦的時候,這些軟件又會依次關閉。因此咱們能夠把這些設置爲開機自啓動。那麼,每次開機的時候,只須要開電腦就好了,其餘的咱們不用關心,能自動開啓。spa

YZComputer

建立YZComputer類,給外界兩個接口,分別是open和close

#import <Foundation/Foundation.h>
#import "YZQQ.h"
#import "YZWeChat.h"
#import "YZXcode.h"

@interface YZComputer : NSObject

-(void)close;
-(void)open;

@end
複製代碼
#import "YZComputer.h"

@interface YZComputer()
@property (strong, nonatomic) YZQQ * qq;
@property (strong, nonatomic) YZWeChat * weChat;
@property (strong, nonatomic) YZXcode * xcode;
@end

@implementation YZComputer

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.qq = [[YZQQ alloc] init];
        self.weChat = [[YZWeChat alloc]init];
        self.xcode = [[YZXcode alloc]init];
    }
    return self;
}

-(void)close{
    NSLog(@"%s",__func__);
    [self.qq close];
    [self.weChat close];
    [self.xcode close];
}
-(void)open{
     NSLog(@"%s",__func__);
    [self.qq open];
    [self.weChat open];
    [self.xcode open];
}
@end

複製代碼

YZQQ

#import <Cocoa/Cocoa.h>

NS_ASSUME_NONNULL_BEGIN

@interface YZQQ : NSObject
-(void)close;
-(void)open;

@end

NS_ASSUME_NONNULL_END
複製代碼
#import "YZQQ.h"

@implementation YZQQ
-(void)close{
    NSLog(@"%s",__func__);
}
-(void)open{
     NSLog(@"%s",__func__);
}
@end
複製代碼

YZWeChat

#import <Cocoa/Cocoa.h>

NS_ASSUME_NONNULL_BEGIN

@interface YZWeChat : NSObject
-(void)close;
-(void)open;

@end

NS_ASSUME_NONNULL_END
複製代碼
#import "YZWeChat.h"

@implementation YZWeChat
-(void)close{
    NSLog(@"%s",__func__);
}
-(void)open{
     NSLog(@"%s",__func__);
}
@end
複製代碼

YZXcode

#import <Cocoa/Cocoa.h>

NS_ASSUME_NONNULL_BEGIN

@interface YZXcode : NSObject
-(void)close;
-(void)open;

@end

NS_ASSUME_NONNULL_END
複製代碼
#import "YZXcode.h"

@implementation YZXcode
-(void)close{
    NSLog(@"%s",__func__);
}
-(void)open{
     NSLog(@"%s",__func__);
}
@end
複製代碼

優勢:

  • 對客戶屏蔽子系統組件,減小了客戶處理的對象數目並使得子系統使用起來更加容易。經過引入外觀模式,客戶代碼將變得很簡單,與之關聯的對象也不多。

  • 實現了子系統與客戶之間的鬆耦合關係,這使得子系統的組件變化不會影響到調用它的客戶類,只須要調整外觀類便可。

  • 下降了大型軟件系統中的編譯依賴性,並簡化了系統在不一樣平臺之間的移植過程,由於編譯一個子系統通常不須要編譯全部其餘的子系統。一個子系統的修改對其餘子系統沒有任何影響,並且子系統內部變化也不會影響到外觀對象。

  • 只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類。

缺點:

  • 外觀類接口膨脹。因爲子系統的接口都有外觀類統一對外暴露,使得外觀類的API接口較多,在必定程度上增長了用戶使用成本。

  • 不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性。

  • 在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。

Demo地址

相關文章
相關標籤/搜索