iOS设计模式之外观模式

786

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情


设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。

这里是设计模式回顾的第十四篇,外观模式的相关回顾。

外观模式

1、什么是外观模式

为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式由三个角色组成:

  1. 外观角色
  2. 子系统角色
  3. 使用角色

外观角色就是高层类,它知道子系统中可以所有实现的功能,并且定义了一些接口,实现了子系统功能的组合。
子系统角色就是实现了小的功能,它们是单独存在的,不必依靠于其他类。对于子系统而言外观角色和使用角色一样,都是调用它们的功能。
使用角色的话就是通过外观角色调用子系统角色,不需要知道子系统的详细实现和具体功能。

2、外观模式用在什么地方

  • 当你要为一个复杂子系统提供一个简单接口时,这是外观模式最直接的使用之一。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性,这里的解藕有些类似中介模式,通过一个中间层接触耦合性。不过并不能因此觉得两者相似,实际上,两者基本没有联系。
  • 当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。当然使用这种情况的前提是你的子系统是层次结构的,而这种层次结构的子系统至少在 APP 中是不常见的。

3、外观模式的使用

  1. 定义一个外观角色类,在.m文件中引用所有子系统角色类
  2. 定义几个高层接口,在接口中实现子系统功能的组合
  3. 使用角色调用外观角色定义的接口。

4、总结

外观模式拥有解藕、易使用、易维护、屏蔽子系统等优点,主要是为了把一个复杂的、耦合度高的系统,变为一个模块化、耦合低的系统集合。

5、demo

SubSystem.swift

import UIKit

class WakeUpSubSystem: NSObject {
    /// 什么地方醒来
    var place : String?
    /// 什么时间
    var time : String?
    
    /// 起床
    func wakeUp() {
        
    }
}
class CallSubSystem: NSObject {
    /// 谁打来电话
    var person : String?
    /// 电话号码
    var number : Int?
    
    /// 打电话/响铃
    func call() {
        
    }
}
class ActionSubSystem: NSObject {
    
    /// 吃饭
    func haveAMeal() {
        
    }
    
    /// 跟朋友见面
    func meetFriend() {
        
    }
    
    /// 与美女见面
    func meetBeauty() {
        
    }
}
Facade.swift

import UIKit

class Facade: NSObject {
    let wakeup = WakeUpSubSystem()
    let call = CallSubSystem()
    let action = ActionSubSystem()
    
    /// 好事 醒来打电话见好友
    func good() {
        wakeup.wakeUp()
        call.call()
        action.meetFriend()
    }
    
    /// 普通 被闹铃吵醒去吃饭
    func normal() {
        call.call()
        wakeup.wakeUp()
        action.haveAMeal()
    }
    
    /// 差 与美女聊天被闹铃吵醒
    func bad() {
        action.meetBeauty()
        call.call()
        wakeup.wakeUp()
    }
}