责任链模式

12/5/2021 swift设计模式

# 责任链模式

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

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

# 样例


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

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

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)
        }
    }

}

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)")
    }
}


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信息
上次更新: 5/5/2022, 8:45:22 AM