聊聊Swift中的设计模式---行为型(责任链模式)

374 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情


前言

在面向对象的开发过程中,其实咱们或多或少的都接触过一些设计模式,可能知道或不知道其对应的名称,也不知道其具体使用场景,今天咱们就来说说几种常见的设计模式,帮助你们在开发过程中,更加得心应手。

正文

责任链模式

责任链模式顾名思义就是将所有可以接受责任的对象串在一起,并连接成一条链,沿着这条链传递查看,直到有可以接受责任的对象处理它为止。

责任链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

这个模式比较像iOS中响应者模式中如何处理控件响应的模式。

在日常开发中,表单验证应该是责任链模式比较适合的使用场景,比如要先验证账号格式,在验证密码格式,再验证验证码是否输入,最后验证是否勾选协议,这个一系列都可以用责任链链接起来。

下面咱们再通过一个例子来解释一下责任链模式

先定义一个log枚举


enum LogLevel: Int {
    case info = 1
    case debug = 2
    case error = 3
}

然后定义logger协议 里面定义了两个变量和两个函数

protocol Logger {
    var level: LogLevel { get set }
    var next: Logger? {get set}
    func log(level: LogLevel, message: String)
    func write(message: String)
}

然后做Logger的扩展


extension Logger {

    func log(level: LogLevel, message: String) {
        if self.level.rawValue <= level.rawValue {
            write(message: message)
        }

        if let next = next {
            next.log(level: level, message: message)
        }
    }

}

然后定义三个继承自Logger的类 分别是ConsoleLogger,ErrorLogger,FileLogger


final class ConsoleLogger: Logger {

    var level: LogLevel
    var next: Logger?

    init(level: LogLevel) {
        self.level = level
    }

    func write(message: String) {
        print("标准输出:(message)")
    }

}

final class ErrorLogger: Logger {

    var level: LogLevel
    var next: Logger?

    init(level: LogLevel) {
        self.level = level
    }

    func write(message: String) {
        print("错误输出:(message)")
    }
}

final class FileLogger: Logger {
    var level: LogLevel
    var next: Logger?

    init(level: LogLevel) {
        self.level = level
    }

    func write(message: String) {
        print("写入文件:(message)")
    }
}

最后,咱们再来定义一个返回Logger的函数,实例化执行


func getLoggersChain() -> Logger {
    let errorLogger = ErrorLogger(level: .error)
    let fileLogger = FileLogger(level: .debug)
    let consoleLogger = ConsoleLogger(level: .info)

    errorLogger.next = fileLogger
    fileLogger.next = consoleLogger
    return errorLogger
}

let loggerChain: Logger = getLoggersChain()

loggerChain.log(level: .info, message: "这是一条普通信息")
loggerChain.log(level: .debug, message: "这是一条Debug信息")
loggerChain.log(level: .error, message: "这是一条Error信息")

最后看看输出结果

标准输出:这是一条普通信息
写入文件:这是一条Debug信息
标准输出:这是一条Debug信息
错误输出:这是一条Error信息
写入文件:这是一条Error信息
标准输出:这是一条Error信息

可以看出,输出的信息完成了链式的传递

结语

责任链模式的优缺点

优点

  • 你可以控制请求处理的顺序。
  • 单一职责原则。 你可对发起操作和执行操作的类进行解耦。
  • 开闭原则。 你可以在不更改现有代码的情况下在程序中新增处理者。

责任链模式缺点

  • 部分请求可能未被处理。

扩展阅读 下面还有其他模式

创建型-工厂模式

创建型-建造者模式

结构型-适配器模式

结构型-桥接模式

结构型-组合模式

结构型-装饰器模式

结构型-外观模式

结构型-享元模式