1. 程式人生 > IOS開發 >iOS設計模式之(七)外觀模式(門面模式、過程模式)

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

本文首發於個人部落格

前言

什麼是外觀模式

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

外觀模式(Facade Pattern)隱藏系統的複雜性,並向客戶端提供了一個客戶端可以訪問系統的介面。這種型別的設計模式屬於結構型模式,它向現有的系統新增一個介面,來隱藏系統的複雜性。

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

模式結構

介紹

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

主要解決:

降低訪問複雜系統的內部子系統時的複雜度,簡化客戶端與之的介面。

何時使用:

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

如何解決:

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

關鍵程式碼:

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

應用例項:

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

使用場景:

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

注意事項:

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

程式碼

場景

每天到公司開電腦,下班離開公司關電腦。而每次開電腦之後,都要開啟Xcode、微信、QQ等等。而每次關電腦的時候,這些軟體又會依次關閉。所以我們可以把這些設定為開機自啟動。那麼,每次開機的時候,只需要開電腦就行了,其他的我們不用關心,能自動開啟。

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__);
}
@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__);
}
@end
複製程式碼

優點:

  • 對客戶遮蔽子系統元件,減少了客戶處理的物件數目並使得子系統使用起來更加容易。通過引入外觀模式,客戶程式碼將變得很簡單,與之關聯的物件也很少。

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

  • 降低了大型軟體系統中的編譯依賴性,並簡化了系統在不同平臺之間的移植過程,因為編譯一個子系統一般不需要編譯所有其他的子系統。一個子系統的修改對其他子系統沒有任何影響,而且子系統內部變化也不會影響到外觀物件。

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

缺點:

  • 外觀類介面膨脹。由於子系統的介面都有外觀類統一對外暴露,使得外觀類的API介面較多,在一定程度上增加了使用者使用成本。

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

  • 在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的原始碼,違背了“開閉原則”。

Demo地址