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介面較多,在一定程度上增加了使用者使用成本。
-
不能很好地限制客戶使用子系統類,如果對客戶訪問子系統類做太多的限制則減少了可變性和靈活性。
-
在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的原始碼,違背了“開閉原則”。