外部與一個子系統的通訊必須經過一個統一的外觀對象進行,爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。atom
代碼:spa
#import <Foundation/Foundation.h> // 子系統1 @interface Light : NSObject - (void)on; - (void)off; @end @implementation Light - (void)on { NSLog(@"開燈"); } - (void)off { NSLog(@"關燈"); } @end // 子系統2 @interface Television : NSObject - (void)on; - (void)off; @end @implementation Television - (void)on { NSLog(@"開電視"); } - (void)off { NSLog(@"關電視"); } @end // 子系統3 @interface Aircondition : NSObject - (void)on; - (void)off; @end @implementation Aircondition - (void)on { NSLog(@"開空調"); } - (void)off { NSLog(@"關空調"); } @end // 整合整個子系統,子系統封裝起來 @interface WatchTvSwtichFacade : NSObject @property (nonatomic, strong)Light *light; @property (nonatomic, strong)Aircondition *airC; @property (nonatomic, strong)Television *tel; - (void)on; - (void)off; @end @implementation WatchTvSwtichFacade - (instancetype)init { self = [super init]; if (self) { self.light = [Light new]; self.airC = [Aircondition new]; self.tel = [Television new]; } return self; } - (void)on { [self.light on]; [self.airC on]; [self.tel on]; } - (void)off{ [self.light off]; [self.airC off]; [self.tel off]; } @end int main(int argc, const char * argv[]) { @autoreleasepool { [[WatchTvSwtichFacade new] on]; [[WatchTvSwtichFacade new] off]; } return 0; }
外觀模式優缺點:code
優勢對象
1.對客戶屏蔽子系統組件,減小了客戶處理的對象數目並使得子系統使用起來更加容易。經過引入外觀模式,客戶代碼將變得很簡單,與之關聯的對象也不多。接口
2.實現了子系統與客戶之間的鬆耦合關係,這使得子系統的組件變化不會影響到調用它的客戶類,只須要調整外觀類便可。it
3.下降了大型軟件系統中的編譯依賴性,並簡化了系統在不一樣平臺之間的移植過程,由於編譯一個子系統通常不須要編譯全部其餘的子系統。一個子系統的修改對其餘子系統沒有任何影響,並且子系統內部變化也不會影響到外觀對象。io
4.只是提供了一個訪問子系統的統一入口,並不影響用戶直接使用子系統類。編譯
缺點class
1.不能很好地限制客戶使用子系統類,若是對客戶訪問子系統類作太多的限制則減小了可變性和靈活性。import
2.在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。