定义
外观是为系统中的一组接口提供统一的接口。外观定义了一个高层接口,让子系统更容易使用。
外观定义了上层接口,通过降低复杂度和隐藏子系统间的通信及依存关系,让子系统更易于使用。
简言之,即对外暴露一个简单易用的接口,内部实现复杂的调用顺序和关系,隐藏程序的复杂度,简化调用成本。更利于程序的修改和重构。
使用场景
以下两种场景适用于外观模式:
- 子系统正在变得复杂,内部扩展出越来越多的类用于实现更加复杂的需求。
- 子系统需要分层管理,每个子系统对应一个外观接口,通过外观通信,简化相互之间的依赖关系。
代码实现
现在我们将打车模拟外观模式的场景,我们作为乘客,只需要告诉司机要去哪里(driveToLocation:x)即可,司机会打开计价器(start Taximeter),松开刹车(releaseBrakes),换挡(changeGears),加油(pressAccelerator),到达目的地后,松油门(releaseAccelerator),踩刹车(pressBrakes)等细化操作。
下面我们设计出类图如下
具体类设计如下
@interface Driver : NSObject
- (void)releaseBrakes;
- (void)pressBrakes;
- (void)changeGears;
- (void)pressAccelerator;
- (void)releaseAccelerator;
@end
@interface Teximeter : NSObject
- (void)start;
- (void)end;
@end
@interface Uber : NSObject
@property (nonatomic, strong)Driver *driver;
@property (nonatomic, strong)Teximeter *teximeter;
- (void)driveToLocation:(CGPoint)point;
@end
@implementation Uber
- (void)driveToLocation:(CGPoint)point {
[self.teximeter start];
[self.driver releaseBrakes];
[self.driver changeGears];
[self.driver pressAccelerator];
[self.driver releaseAccelerator];
[self.driver pressBrakes];
[self.teximeter end];
}
@end
上述实现并不复杂,试想我们再加入打车调度系统,计价系统的流程,是否对乘客来说,暴露一个简单的接口是非常有必要的。
总结
外观有助于提供一种更为简洁的方式来使用子系统的 类,处理这些子系统类的默认行为,定义一个简单的方法,而不必去直接使用这些复杂的类。同时也防止外部调用需要跟随内部系统修改。