設計模式-外觀模式

模式定義

外部與一個子系統的通訊必須經過一個統一的外觀對象進行,爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。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.在不引入抽象外觀類的狀況下,增長新的子系統可能須要修改外觀類或客戶端的源代碼,違背了「開閉原則」。

相關文章
相關標籤/搜索