iOS设计模式之外观

351 阅读2分钟

定义

外观是为系统中的一组接口提供统一的接口。外观定义了一个高层接口,让子系统更容易使用。

外观定义了上层接口,通过降低复杂度和隐藏子系统间的通信及依存关系,让子系统更易于使用。

简言之,即对外暴露一个简单易用的接口,内部实现复杂的调用顺序和关系,隐藏程序的复杂度,简化调用成本。更利于程序的修改和重构。

使用场景

以下两种场景适用于外观模式:

  • 子系统正在变得复杂,内部扩展出越来越多的类用于实现更加复杂的需求。
  • 子系统需要分层管理,每个子系统对应一个外观接口,通过外观通信,简化相互之间的依赖关系。

代码实现

现在我们将打车模拟外观模式的场景,我们作为乘客,只需要告诉司机要去哪里(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

上述实现并不复杂,试想我们再加入打车调度系统,计价系统的流程,是否对乘客来说,暴露一个简单的接口是非常有必要的。

总结

外观有助于提供一种更为简洁的方式来使用子系统的 类,处理这些子系统类的默认行为,定义一个简单的方法,而不必去直接使用这些复杂的类。同时也防止外部调用需要跟随内部系统修改。