一、概念
通过将多个处理器(处理对象)以链式结构连接起来,使得请求沿着这条链传递,直到有一个处理器处理该请求为止。
|-----------------------|---------------------------------------------|
| Handler 处理器接口 | 所有处理器必须实现同一个接口。通常包含一个处理请求的方法和一个指向下一个处理者的引用。 |
| ConcreteHandler 具体处理器 | 负责处理请求。能处理就处理,否则将请求传递给下一个处理器。 |
二、实现
2.1 处理器接口
Kotlin
interface IBudgetHandler {
fun setNextHandler(nextHandler: IBudgetHandler)
fun handle(amount: Int): Boolean
}
2.2 具体处理器
最终处理器 CFO 对设置下一个处理器空实现,超出处理范围直接返回false。
Kotlin
class GroupLeader : IBudgetHandler {
private var nextHandler: IBudgetHandler? = null
override fun setNextHandler(nextHandler: IBudgetHandler) {
this.nextHandler = nextHandler
}
override fun handle(amount: Int): Boolean = if (amount < 100) {
println("组长:100元以内批了")
true
} else {
nextHandler?.handle(amount) ?: false
}
}
class Manager : IBudgetHandler {
private var nextHandler: IBudgetHandler? = null
override fun setNextHandler(nextHandler: IBudgetHandler) {
this.nextHandler = nextHandler
}
override fun handle(amount: Int): Boolean = if (amount < 1000) {
println("经理:1000元以内批了")
true
} else {
nextHandler?.handle(amount) ?: false
}
}
class CFO : IBudgetHandler {
override fun setNextHandler(nextHandler: IBudgetHandler) {}
override fun handle(amount: Int): Boolean = if (amount < 10000) {
println("首席财务官:10000元以内批了")
true
} else {
println("金额超出最大权限,无法批准")
false
}
}
2.3 使用
Kotlin
fun main() {
val groupLeader = GroupLeader()
val manager = Manager()
val cfo = CFO()
groupLeader.setNextHandler(manager)
manager.setNextHandler(cfo)
if (groupLeader.handle(7000)) {
print("审批成功")
} else {
print("审批失败")
}
}