美文网首页
Chain of Responsibility Pattern(

Chain of Responsibility Pattern(

作者: 一个追寻者的故事 | 来源:发表于2020-09-14 00:08 被阅读0次

介绍

责任链模式是行为型设计模式之一。将多个节点首尾相连所构成的模型称为链。将这样一种结构应用于编程领域,将每一个节点看做一个对象,每个对象拥有不同的处理逻辑,将一个请求从链的首端出发,沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止。

定义

使多个对象都有机会处理请求,从而避免了请求的 发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止

使用场景

多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。

应用

最常模拟的例子是公司管理层权力体系。例如报销,组长、主管、经理、老板,不同级别的人拥有签署报销的金额数量是不一样的。 模拟一下:

//抽象的Leader
abstract class Leader {
    var nextLeader: Leader? = null  //  上一级领导

    // 责任链的处理规则封装
    fun handleRequest(money: Int){
        if (money < limit()) {
            handle(money)  // 能自己处理的就处理
        }else{  // 处理不了,请求传递给下一个处理者。
            nextLeader?.handleRequest(money)      
        }
    }

    // 自身权限的金额
    abstract fun limit(): Int
    // 具体处理逻辑
    abstract fun handle(money: Int)
}

// 组长
class GroupLeader : Leader(){
    override fun limit(): Int {
        return 1000
    }

    override fun handle(money: Int) {
        println("组长批复报销 $money 元")
    }
}

// 主管
class Director : Leader(){
    override fun limit(): Int {
        return 5000
    }

    override fun handle(money: Int) {
        println("主管批复报销 $money 元")
    }
}

// 经理
class Manager : Leader(){
    override fun limit(): Int {
        return 10000
    }

    override fun handle(money: Int) {
        println("经理批复报销 $money 元")
    }
}

// 老板
class Boss : Leader(){
    override fun limit(): Int {
        return Int.MAX_VALUE
    }

    override fun handle(money: Int) {
        println("老板批复报销 $money 元")
    }
}

fun main() {
    val groupLeader = GroupLeader()
    val director = Director()
    val manager = Manager()
    val boss = Boss()

    groupLeader.nextLeader = director
    director.nextLeader = manager
    manager.nextLeader = boss

    //发起报账
    groupLeader.handleRequest(8000)
}

例子中的请求信息是单纯的 Int,实际应用中请求可以是一个对象,是否符合当前处理着去处理的逻辑可以很复杂。

如果非要说实际应用中的例子,哪个是责任链模式,我觉得最像的是过滤器的概念,过滤器可以有很多层,不符合条件的会直接返回,只有符合条件的请求才会被处理。

其它

如果看过网上 关于 OkHttp Interceptor 讲解的,有一部分人把这个的过程看作是 责任链模式,我觉得不是很合适,因为说实话跟 责任链模式 的定义不太符。OkHttp 的 Interceptor 确实是通过 Interceptor.Chain 把发送请求的过程分解成很多子过程,然后通过链的形式串联在一起了,形式上确实很像。

但如果细品的话发现其实是不一样的。OkHttp 的 Interceptor计算机网络的分层结构思想类似。把一个复杂问题通过分层的方式分解,每一层的功能相对简单特定。发送请求时,请求通过体系中的每一层,层层往下传递;返回时正好相反,返回信息会层层网上传递。也就是说你想要进行一次正确完整的网络请求,必然会经历 Interceptor.Chain 的每一层的处理;返回时也会经过每一层的处理。而 责任链模式 中链中的每一环都有可能是最终正常逻辑处理的终点。

OkHttp 的 Interceptor 另外一点有意思的是,它可以让用户自定义的行为嵌入整个网络请求层次当中,通过自定义 Interceptor 来实现干预网络请求的逻辑。

小结:不管 OkHttp Interceptor 是什么设计模式吧,它确实给我们提供了一种处理复杂问题的思路,了解具体实现的细节差异,帮助我们为解决实际中的问题提供一种解决方案足矣。

相关文章

网友评论

      本文标题:Chain of Responsibility Pattern(

      本文链接:https://www.haomeiwen.com/subject/wokbektx.html