本文首發於我的博客html
外觀模式(Facade Pattern)隱藏系統的複雜性,並向客戶端提供了一個客戶端能夠訪問系統的接口。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的複雜性。github
這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法的委託調用。設計模式
意圖:爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。xcode
下降訪問複雜系統的內部子系統時的複雜度,簡化客戶端與之的接口。bash
客戶端不與系統耦合,外觀類與系統耦合。微信
在客戶端和複雜系統之間再加一層,這一層將調用順序、依賴關係等處理好。ui
在層次化結構中,可使用外觀模式定義系統中每一層的入口。atom
天天到公司開電腦,下班離開公司關電腦。而每次開電腦以後,都要打開Xcode、微信、QQ等等。而每次關電腦的時候,這些軟件又會依次關閉。因此咱們能夠把這些設置爲開機自啓動。那麼,每次開機的時候,只須要開電腦就好了,其餘的咱們不用關心,能自動開啓。spa
建立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
複製代碼
#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
複製代碼
#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
複製代碼
#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接口較多,在必定程度上增長了用戶使用成本。
不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性。
在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。