介绍
责任链模式是行为型设计模式之一。将多个节点首尾相连所构成的模型称为链。将这样一种结构应用于编程领域,将每一个节点看做一个对象,每个对象拥有不同的处理逻辑,将一个请求从链的首端出发,沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止。
定义
使多个对象都有机会处理请求,从而避免了请求的 发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
使用场景
多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
应用
最常模拟的例子是公司管理层权力体系。例如报销,组长、主管、经理、老板,不同级别的人拥有签署报销的金额数量是不一样的。 模拟一下:
//抽象的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
是什么设计模式吧,它确实给我们提供了一种处理复杂问题的思路,了解具体实现的细节差异,帮助我们为解决实际中的问题提供一种解决方案足矣。
网友评论