美文网首页iOSAPP & program
iOS 设计模式的应用 ⑧ 外观模式

iOS 设计模式的应用 ⑧ 外观模式

作者: _涼城 | 来源:发表于2022-05-11 07:33 被阅读0次

    前言

        比方说今天不想开车,于是打电话叫了出租车。只要出租车能把你送到目的地,你会对出租车说的第一句话是"送我去 xxx"。然后出租车司机就开始执行一系列的 “动作”(松刹车,踩油门等)。出租车司机抽象走了驾驶汽车的底层复制操作的细节,他通过提供驾驶服务(简化了的接口),把你与原本复杂的车辆操作接口分离开来,这种方式称为外观模式

    什么是外观模式

        外观模式(Facade Pattern)为子系统中的一组接口提供一个一致的界面,外观模式在客户端和复杂系统之间定义了一个上层接口,解决了客户端与系统耦合,通过降低复杂度和隐藏子系统之间的通信及依存关系,使得这一子系统更加容易使用。

    一个外观实现的示例结构图.png

    什么时候使用外观模式

    • 客户端不需要知道系统内部的复杂联系,为复杂的模块或子系统提供外界访问的模块。
    • 子系统相对独立,定义其入口。

    外观模式的优缺点

    外观模式的优点

    1. 减少系统相互依赖。
    2. 提高灵活性。
    3. 提高了安全性。

    外观模式的缺点

    不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

    外观模式的实现

        回到出租车的例子,有一辆出租车,其出租车司机为驾驶出租车的一组复杂接口提供了一个简化的接口。整个出租车服务作为一个封闭系统,包含一名出租车司机,一辆车和一台计价器。乘客和出租车系统交互的唯一途径就是通过向出租车司机发送 driveToLocation:x 消息。

    出租车类图.png
    1. Car 定义了几个动作,如 releaseBrakes (松刹车)、changeGears(换档) 等等。
    @interface Car : NSObject 
    - (void) releaseBrakes;
    - (void) changeGears;
    - (void) pressAccelerator;
    - (void) pressBrakes;
    - (void) releaseAccelerator;
    // ...
    @end
    @implementation Car
    - (void) releaseBrakes{}
    - (void) changeGears{}
    - (void) pressAccelerator{}
    - (void) pressBrakes{}
    - (void) releaseAccelerator{}
    @end
    
    
    1. Taximeter 定义了两个事件,start (开始)和 stop(停止)
    @interface Taximeter : NSObject 
    - (void) start;
    - (void) stop;
    @end
    @implementation Taximeter
    - (void) start{}
    - (void) stop{}
    @end
    
    1. CarbDriver 作为 "外观" 以简化接口

      @interface CabDriver : NSObject 
      - (void) driveToLocation:(CGPoint) x;
      @end
      @implementation CabDriver
      
      - (void) driveToLocation:(CGPoint) x
      {
        // ...
        
        // set off the taximeter
        Taximeter *meter = [[Taximeter alloc] init];
        [meter start];
        
        // operate the vehicle
        // until location x is reached
        Car *car = [[Car alloc] init];
        [car releaseBrakes];
        [car changeGears];
        [car pressAccelerator];
        
        // ...
        
        // when it's reached location x
        // then stop the car and taximeter
        [car releaseAccelerator];
        [car pressBrakes];
        [meter stop];
        
        // ...
      }
      
      @end
      

    总结

        当程序逐渐变大变复杂时,会有越来越多小型的类从设计和应用模式中演化出来。如果没有一种简化的方式来使用这些类,客户端代码最终变得越来越大,越来越难以理解,而且维护起来会繁琐无趣。外观有助于提供一种更为简洁的方式来使用子系统中的这些类。处理这些类的默认行为的,只是定义在外观中的一个简单的方法,而不必直接去使用这些类。

    相关文章

      网友评论

        本文标题:iOS 设计模式的应用 ⑧ 外观模式

        本文链接:https://www.haomeiwen.com/subject/nefdurtx.html