外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
优点:
1、降低了模块与模块之间的依赖,完美地体现了依赖倒转原则和迪米特法则的思想
2、只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
3、降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程
缺点:
1、不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
2、在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
模式总结
1、 外观模式的主要优点就在于减少了系统与系统之间的关联对象,使用客户对子系统的使用变得简单了,也实现了客户与子系统之间的松耦合关系。它的缺点就在于违背了“开闭原则”。
2、 如果需要实现一个外观模式,需要将子系统组合进外观中,然后将工作委托给子系统执行。
项目地址:https://github.com/GameRisker/Study-Design-Patterns.git
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// // main.m // Facade // // Created by GameRisker on 16/1/24. // Copyright (c) 2016年 GameRisker. All rights reserved. // #import "Facade.h" #import <Foundation/Foundation.h> int main(int argc, const char *argv[]) { @autoreleasepool { // insert code here... Facade *facade = [[Facade alloc] init]; [facade MothedA]; [facade MothedB]; } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// // Facade.h // // // Created by GameRisker on 16/1/24. // // #import "SubSystemFour.h" #import "SubSystemOne.h" #import "SubSystemThree.h" #import "SubSystemTwo.h" #import <Foundation/Foundation.h> @interface Facade : NSObject @property(strong, nonatomic) SubSystemOne *m_subOne; @property(strong, nonatomic) SubSystemTwo *m_subTwo; @property(strong, nonatomic) SubSystemThree *m_subThree; @property(strong, nonatomic) SubSystemFour *m_subFour; - (void)MothedA; - (void)MothedB; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// // Facade.m // // // Created by GameRisker on 16/1/24. // // #import "Facade.h" @implementation Facade - (instancetype)init { if (self = [super init]) { self.m_subOne = [[SubSystemOne alloc] init]; self.m_subTwo = [[SubSystemTwo alloc] init]; self.m_subThree = [[SubSystemThree alloc] init]; self.m_subFour = [[SubSystemFour alloc] init]; } return self; } - (void)MothedA { [self.m_subOne MethodOne]; [self.m_subTwo MethodTwo]; [self.m_subThree MethodThree]; } - (void)MothedB { [self.m_subOne MethodOne]; [self.m_subTwo MethodTwo]; [self.m_subFour MethodFour]; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// // SubSystemOne.h // // // Created by GameRisker on 16/1/24. // // #import <Foundation/Foundation.h> @interface SubSystemOne : NSObject - (void)MethodOne; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// // SubSystemOne.m // // // Created by GameRisker on 16/1/24. // // #import "SubSystemOne.h" @implementation SubSystemOne - (void)MethodOne { NSLog(@"execution Method One."); } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// // SubSystemTwo.h // // // Created by GameRisker on 16/1/24. // // #import <Foundation/Foundation.h> @interface SubSystemTwo : NSObject - (void)MethodTwo; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// // SubSystemTwo.m // // // Created by GameRisker on 16/1/24. // // #import "SubSystemTwo.h" @implementation SubSystemTwo - (void)MethodTwo { NSLog(@"execution Method Two."); } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// // SubSystemThree.h // // // Created by GameRisker on 16/1/24. // // #import <Foundation/Foundation.h> @interface SubSystemThree : NSObject - (void)MethodThree; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// // SubSystemThree.m // // // Created by GameRisker on 16/1/24. // // #import "SubSystemThree.h" @implementation SubSystemThree - (void)MethodThree { NSLog(@"execution Method Three."); } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// // SubSystemFour.h // // // Created by GameRisker on 16/1/24. // // #import <Foundation/Foundation.h> @interface SubSystemFour : NSObject - (void)MethodFour; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// // SubSystemFour.m // // // Created by GameRisker on 16/1/24. // // #import "SubSystemFour.h" @implementation SubSystemFour - (void)MethodFour { NSLog(@"execution Method Four."); } @end |