设计模式 - 责任链模式 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("审批失败")
    }
}
相关推荐
Railshiqian42 分钟前
通过adb命令获取某个window或View/子View的绘制内容并输出为png图片的方法
android·adb·dump view
XI锐真的烦42 分钟前
新手该如何选择 Android 开发框架?
android
走在路上的菜鸟1 小时前
Android学Dart学习笔记第二十六节 并发
android·笔记·学习·flutter
阿闽ooo1 小时前
单例模式深度解析:从饿汉到懒汉的实战演进
开发语言·c++·笔记·设计模式
00后程序员张1 小时前
AppStoreInfo.plist 在苹果上架流程中的生成方式和作用
android·小程序·https·uni-app·iphone·webview
成都大菠萝1 小时前
2-2-10 快速掌握Kotlin-out协变
android
成都大菠萝1 小时前
2-2-8 快速掌握Kotlin-vararg关键字与get函数
android
成都大菠萝1 小时前
2-2-7 快速掌握Kotlin-泛型类型约束
android
城东米粉儿1 小时前
Collections.synchronizedMap()与ConcurrentHashMap的区别笔记
android
愤怒的代码1 小时前
深入解析 Binder 运行的状态
android·app