本文首发于我的博客html
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端能够访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。github
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。设计模式
意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。xcode
下降访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。bash
客户端不与系统耦合,外观类与系统耦合。微信
在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。ui
在层次化结构中,可使用外观模式定义系统中每一层的入口。atom
天天到公司开电脑,下班离开公司关电脑。而每次开电脑以后,都要打开Xcode、微信、QQ等等。而每次关电脑的时候,这些软件又会依次关闭。因此咱们能够把这些设置为开机自启动。那么,每次开机的时候,只须要开电脑就好了,其余的咱们不用关心,能自动开启。spa
建立YZComputer
类,给外界两个接口,分别是open和close
#import <Foundation/Foundation.h>
#import "YZQQ.h"
#import "YZWeChat.h"
#import "YZXcode.h"
@interface YZComputer : NSObject
-(void)close;
-(void)open;
@end
复制代码
#import "YZComputer.h"
@interface YZComputer()
@property (strong, nonatomic) YZQQ * qq;
@property (strong, nonatomic) YZWeChat * weChat;
@property (strong, nonatomic) YZXcode * xcode;
@end
@implementation YZComputer
- (instancetype)init
{
self = [super init];
if (self) {
self.qq = [[YZQQ alloc] init];
self.weChat = [[YZWeChat alloc]init];
self.xcode = [[YZXcode alloc]init];
}
return self;
}
-(void)close{
NSLog(@"%s",__func__);
[self.qq close];
[self.weChat close];
[self.xcode close];
}
-(void)open{
NSLog(@"%s",__func__);
[self.qq open];
[self.weChat open];
[self.xcode open];
}
@end
复制代码
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface YZQQ : NSObject
-(void)close;
-(void)open;
@end
NS_ASSUME_NONNULL_END
复制代码
#import "YZQQ.h"
@implementation YZQQ
-(void)close{
NSLog(@"%s",__func__);
}
-(void)open{
NSLog(@"%s",__func__);
}
@end
复制代码
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface YZWeChat : NSObject
-(void)close;
-(void)open;
@end
NS_ASSUME_NONNULL_END
复制代码
#import "YZWeChat.h"
@implementation YZWeChat
-(void)close{
NSLog(@"%s",__func__);
}
-(void)open{
NSLog(@"%s",__func__);
}
@end
复制代码
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface YZXcode : NSObject
-(void)close;
-(void)open;
@end
NS_ASSUME_NONNULL_END
复制代码
#import "YZXcode.h"
@implementation YZXcode
-(void)close{
NSLog(@"%s",__func__);
}
-(void)open{
NSLog(@"%s",__func__);
}
@end
复制代码
对客户屏蔽子系统组件,减小了客户处理的对象数目并使得子系统使用起来更加容易。经过引入外观模式,客户代码将变得很简单,与之关联的对象也不多。
实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只须要调整外观类便可。
下降了大型软件系统中的编译依赖性,并简化了系统在不一样平台之间的移植过程,由于编译一个子系统通常不须要编译全部其余的子系统。一个子系统的修改对其余子系统没有任何影响,并且子系统内部变化也不会影响到外观对象。
只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
外观类接口膨胀。因为子系统的接口都有外观类统一对外暴露,使得外观类的API接口较多,在必定程度上增长了用户使用成本。
不能很好地限制客户使用子系统类,若是对客户访问子系统类作太多的限制则减小了可变性和灵活性。
在不引入抽象外观类的状况下,增长新的子系统可能须要修改外观类或客户端的源代码,违背了“开闭原则”。