外观模式
外观模式(Facade Pattern)为子系统中的一组接口提供一个一致的界面,外观模式在客户端和复杂系统之间定义了一个上层接口,解决了客户端与系统耦合,通过降低复杂度和隐藏子系统之间的通信及依存关系,使得这一子系统更加容易使用
外观模式又称为门面模式,它是一种对象结构型模式。外观模式是迪米特法则的一种具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。
外观模式的2个角色
1)Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
2)SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。
举个🌰
外观模式中所指的子系统是一个广义的概念,它可以是一个类、一个功能模块、系统的一个组成部分或者一个完整的系统
1)先创建三个类DepartmentOfPediatrics(儿科)、SurgicalDepartment(外科)和InternalMedicine(内科)表示子系统角色;
2)然后创建一个Hospital类,拥有上述三个类的实例,方便调用三个科室的方法,表示外观角色
JCDepartmentOfPediatrics
@interface JCDepartmentOfPediatrics : NSObject
- (void)showDetail;
@end
- (void)showDetail {
NSLog(@"这是儿科");
}
JCSurgicalDepartment
@interface JCSurgicalDepartment : NSObject
- (void)showDetail;
@end
@implementation JCSurgicalDepartment
- (void)showDetail {
NSLog(@"这是wai科");
}
@end
JCInternalMedicine
@interface JCInternalMedicine : NSObject
- (void)showDetail;
@end
@implementation JCInternalMedicine
- (void)showDetail {
NSLog(@"这是内科");
}
@end
JCHospital
@interface JCHospital ()
@property(nonatomic, strong) JCSurgicalDepartment *surgical;
@property(nonatomic, strong) JCInternalMedicine *Internal;
@property(nonatomic, strong) JCDepartmentOfPediatrics *department;
@end
@implementation JCHospital
- (instancetype)init {
self = [super init];
if (self) {
_surgical = [JCSurgicalDepartment new];
_Internal = [JCInternalMedicine new];
_department = [JCDepartmentOfPediatrics new];
}
return self;
}
- (void)showAllDepartments {
[self.surgical showDetail];
[self.Internal showDetail];
[self.department showDetail];
}
JCFacadeViewController.h
#import "JCFacadeViewController.h"
#import <JVTDChainUIHeader.h>
#import "JCHospital.h"
@interface JCFacadeViewController ()
@end
@implementation JCFacadeViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.c_backgroundColor([UIColor whiteColor]);
self.title = @"桥接模式";
[[JCHospital new] showAllDepartments];
}
总结
外观模式是一种使用频率非常高的设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,使子系统与客户端的耦合度降低,且客户端调用非常方便。外观模式并不给系统增加任何新功能,它仅仅是简化调用接口。所有涉及到与多个业务对象交互的场景都可以考虑使用外观模式进行重构。