[设计模式] 再识责任链模式

前言

今天通过面试复习了责任链模式. 又回头看了下之前的笔记. 突然就加深了理解.


正文


之前理解

之前的理解. 责任链就是一个链式结构, 经典的例子就是一个任务在几个人之间传递执行.
在这里插入图片描述
面试完之后想了想发现事情并没有想象滴那么简单.

面试解答: 责任链就是一个责任流程. 责任链可以在责任链的任意一处结束. 例子: 医院看病流程. (挂号 -> 问诊 -> 取药 -> 挂号台付款)

主要业务场景: 业务流 / 热插拔流


目前理解

我发现, 对于很多事物. 从名字上进行划分就非常Nice.

责任链模式. 主体包括责任这2个部分. 个人认为, 所谓责任链模式. 即, 以责任为载体的链式处理结构. 链式中处理责任的单元, 个人认为叫做处理单元. 责任在链式中传播, 而不需要知道责任究竟是被哪个责任单元执行. 责任链, 其实就是一个责任与处理单元的解耦过程.

这样, 我们回头看那个问题.

(病人) (挂号 -> 问诊 -> 取药 -> 挂号台付款)流程是责任链么?
答案: 是的.

  1. 他们都有相同的责任: 处理病人.
  2. 在业务流程中, 病人这一责任可以链式传递下去. 并且可以跳过某些责任处理单元. 或者在任意的责任处理单元上停止.

再回头看一看. 会发现如下的几个特性:

  • 责任链中, 处理的责任对象基本相同.
  • 责任处理单元需要实现同一责任处理接口.
  • 责任在传递的过程中可能会发生变化.
  • 责任可以跳过某些处理单元. 或者在中间的某一处理单元上停止.

责任链的主要优点在于解耦合. 将责任责任处理单元解除耦合. 可以使得责任在多个处理单元上以链式的形式进行流动.

责任链的优点同时也是责任链的缺点. 那就是责任可以跳过某些责任处理单元, 且在任一责任处理单元上停止. 因为责任链的灵活性和链式流动性, 责任链无法确定到底是哪个责任处理单元处理的责任.


简单代码实现

了解以上特性. 不难写出如下代码:

class People{
	public String name;
}

// 处理接口
class ISolveProblem{
	public void solve(People people);
}

// 挂号
class GuaHao implements ISolveProblem{
		public void solve(People people){
			System.out.println("挂号"+people.name);
		}
		public ISolveProblem nextNode;
}

// 问诊
class WenZhen implements ISolveProblem{
		public void solve(People people){
			System.out.println("问诊"+people.name);
		}
		public ISolveProblem nextNode;
}

// 开药
class KaoYao implements ISolveProblem{
		public void solve(People people){
			System.out.println("问诊"+people.name);
		}
		public ISolveProblem nextNode;
}

To Be Continue


More

关于责任链的通用类图. 可以看下我之前的总结:
设计模式之(四) 行为模式

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页