外观模式(Facade Pattern)
2022-09-13 本文已影响0人
long弟弟
外观模式,门面模式
意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作外观模式。
外观模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。

角色和职责
- Facade
知道哪些子系统类负责处理请求
将客户的请求代理给适当的子系统对象 - SubSystem
实现子系统的功能
处理有Facade对象指派的任务
没有facade的任何相关信息;即没有指向facade的指针
代码示例
#import <Foundation/Foundation.h>
@interface SubSystemA : NSObject
@end
@implementation SubSystemA
- (void)doSomething {
NSLog(@"SubSystemA - doSomething");
}
@end
@interface SubSystemB : NSObject
@end
@implementation SubSystemB
- (void)doSomething {
NSLog(@"SubSystemB - doSomething");
}
@end
@interface SubSystemC : NSObject
@end
@implementation SubSystemC
- (void)doSomething {
NSLog(@"SubSystemC - doSomething");
}
@end
//外观模式
@interface Facade : NSObject {
SubSystemA *_subA;
SubSystemB *_subB;
SubSystemC *_subC;
}
@end
@implementation Facade
- (instancetype)init {
if (self = [super init]) {
_subA = [[SubSystemA alloc] init];
_subB = [[SubSystemB alloc] init];
_subC = [[SubSystemC alloc] init];
}
return self;
}
- (void)doSomething {
[_subA doSomething];
[_subB doSomething];
[_subC doSomething];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
SubSystemA *subA = [[SubSystemA alloc] init];
SubSystemB *subB = [[SubSystemB alloc] init];
SubSystemC *subC = [[SubSystemC alloc] init];
[subA doSomething];
[subB doSomething];
[subC doSomething];
NSLog(@"外观模式");
Facade *facade = [[Facade alloc] init];
[facade doSomething];
}
return 0;
}
/*
SubSystemA - doSomething
SubSystemB - doSomething
SubSystemC - doSomething
外观模式
SubSystemA - doSomething
SubSystemB - doSomething
SubSystemC - doSomething
*/
用处
为子系统中统一一套接口,让子系统更加容易使用。
比如文件流的打开和关闭,客户端只需调用open
和close
即可,无须了解底层处理多线程、权限等逻辑。外观模式封装系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。
现实中的投资,比如可以买股票、债券和期货。抽象出基金层,分稳健型和激进型,激进型买股票和期货,稳健型买债券。
优点
- 对客户屏蔽系统组件,减少客户处理的对象数目,并使得子系统使用起来更加方便。
- 提高灵活性。
- 提供了安全性。
缺点
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
题外话
外观模式和适配器模式的共同点都是将不好用的接口变成好用的接口。主要区别看意图,适配器模式
是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。外观模式
是为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更加容易使用。所以适配器不需要定义新的接口(只是通过接口封装),而外观模式是定义一套新的接口,以方便使用。