设计模式 - 责任链模式 Chain of Responsibility Pattern

一、概念

通过将多个处理器(处理对象)以链式结构连接起来,使得请求沿着这条链传递,直到有一个处理器处理该请求为止。

|-----------------------|---------------------------------------------|
| 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("审批失败")
    }
}
相关推荐
李斯维1 小时前
Jetpack 可观察数据容器 LiveData 的入门与基础使用
android·android jetpack
老码观察1 小时前
设计模式实战解读(八):代理模式——控制访问的隐形中间层
设计模式·代理模式
问心无愧05131 小时前
ctf show web入门261
android·前端·笔记
alexhilton2 小时前
车载系统中的可扩展UI:从UI嵌入到系统窗口编排
android·kotlin·android jetpack
我爱cope2 小时前
【Agent智能体12 | 反思设计模式-使用外部反馈】
人工智能·设计模式·语言模型·职场和发展
geovindu2 小时前
python: Bounded Parallelism Pattern
开发语言·python·设计模式·有界并行模式
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第一章 Item 4 - 6)
android·数据库·论文阅读·python
therese_100862 小时前
安卓面试题
android
码云骑士2 小时前
Android Launcher启动过程
android
我爱cope3 小时前
【Agent智能体11 | 反思设计模式-评估反射的影响的方法】
人工智能·设计模式·语言模型·职场和发展