持续创作,加速成长!这是我参与「掘金日新计划 · 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信息
可以看出,输出的信息完成了链式的传递
结语
责任链模式的优缺点
优点
- 你可以控制请求处理的顺序。
- 单一职责原则。 你可对发起操作和执行操作的类进行解耦。
- 开闭原则。 你可以在不更改现有代码的情况下在程序中新增处理者。
责任链模式缺点
- 部分请求可能未被处理。
扩展阅读 下面还有其他模式