目录
介绍
责任链模式是一种行为设计模式,它允许将请求从一个对象传递到另一个对象,直到请求被处理为止。在责任链模式中,每个对象都有机会处理请求,但它们也可以选择将请求传递给下一个处理者。
使用责任链模式的场景包括:
- 当有多个对象可以处理同一个请求时,但只有其中一个对象需要处理请求。
- 当需要动态指定处理请求的对象。
- 当需要按照一定顺序处理多个请求。
应用场景
点击按钮然后实现:校验数据是否正确,处理数据,记录到本地,发送请求。
示例代码:
Kotlin
// 定义一个处理器接口
interface ClickChain {
fun setNext(handler: ClickChain): ClickChain
fun handle(request: Request): Boolean
}
// 请求类
data class Request(var data: String, var isValid: Boolean = false)
// 校验数据的处理器
class ValidationChain : ClickChain {
private var nextHandler: ClickChain? = null
override fun setNext(handler: ClickChain): ClickChain {
nextHandler = handler
return handler
}
override fun handle(request: Request): Boolean {
// 校验数据
request.isValid = request.data != ""
if (!request.isValid) {
println("数据校验失败")
return false
}
println("数据校验通过")
return nextHandler?.handle(request) ?: true
}
}
// 处理数据的处理器
class ProcessingChain : ClickChain {
private var nextHandler: ClickChain? = null
override fun setNext(handler: ClickChain): ClickChain {
nextHandler = handler
return handler
}
override fun handle(request: Request): Boolean {
// 处理数据
request.data = request.data.trim().uppercase()
println("数据处理完成: ${request.data}")
return nextHandler?.handle(request) ?: true
}
}
// 记录到本地的处理器
class LocalStorageChain : ClickChain {
private var nextHandler: ClickChain? = null
override fun setNext(handler: ClickChain): ClickChain {
nextHandler = handler
return handler
}
override fun handle(request: Request): Boolean {
// 记录到本地
println("数据已记录到本地: ${request.data}")
return nextHandler?.handle(request) ?: true
}
}
// 发送请求的处理器
class NetworkRequestChain : ClickChain {
override fun setNext(handler: ClickChain): ClickChain {
throw UnsupportedOperationException("最后的处理器不支持设置下一个处理器")
}
override fun handle(request: Request): Boolean {
// 发送网络请求
println("发送网络请求: ${request.data}")
return true
}
}
// 主函数,模拟按钮点击处理
fun main() {
// 创建责任链
val validationC = ValidationChain()
val processingC = ProcessingChain()
val localStorageC = LocalStorageChain()
val networkRequestC = NetworkRequestChain()
// 设置责任链
validationC.setNext(processingC).setNext(localStorageC).setNext(networkRequestC)
// 处理请求
validationC.handle(Request(data = ""))
}
总结
使用责任链模式可以避免大量的条件语句,使代码更加可扩展和可维护。同时,它也符合单一职责原则,每个处理者只需要关注自己的责任,而不需要关注其他的逻辑。