设计模式 - 责任链模式 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("审批失败")
    }
}
相关推荐
我命由我123452 小时前
Android Studio - Android Studio 自定义预览尺寸
android·java·ide·java-ee·android studio·android-studio·android runtime
咖啡八杯3 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
取个名字太难了~4 小时前
越用越便宜,越用越强大:影像 SDK 的边际成本递减与网络效应实践
android·数码相机·美颜·相机连接·demu
ttod_qzstudio4 小时前
【软考设计模式】外观模式:复杂子系统的“门面“封装与代码填空精讲
设计模式·外观模式
AFinalStone8 小时前
Android 7系统网络(四)Native层(下)—netd Controller详解
android·网络
爱笑鱼8 小时前
Handler(一):post 之后,Runnable 到底在哪个线程执行?
android
木木子229 小时前
[特殊字符] 音乐播放器——状态驱动的多媒体控制
android·开发语言·华为·php·harmonyos
雨白9 小时前
C 语言基础:结构体、联合体与枚举
android
阿巴斯甜10 小时前
Android 代码混淆
android
geovindu11 小时前
CSharp: Prototype Pattern
开发语言·后端·设计模式·.net·原型模式·创建型模式