责任链模式|青训营笔记

61 阅读3分钟

1. 模式目标

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。这样的目的是避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

2. 模式结构

image.png

以上是责任链模式的简单UML图,其中:AbstractHandler:解决问题的抽象类ConcreteHandlerA/B/C:用来解决问题的若干类,是对抽象类的实现ChainClient:客户类,发出问题其中ConcreteHandlerA完成不了的问题会交给ConcreteHandlerB,如果ConcreteHandlerB还完成不了则交给ConcreteHandlerC。

3. 模式适用场景

第一,当程序需要使用不同方式处理不同种类请求,而且请求类型和顺序预先未知时,可以使用责任链模式。第二,当必须按顺序执行多个处理者时, 可以使用该模式。第三,如果所需处理者及其顺序必须在运行时进行改变, 可以使用责任链模式。

4. 模式优缺点分析

优点:可以控制请求的顺序,且符合单一职责原则,可以对发起操作和执行操作的类进行解耦。符合开闭原则,可以在不更改现有代码的情况下新增处理者。责任链简化了对象之间的连接,避免过多食用IF-ELSE语句。缺点:部分请求可能无法得到处理,因为处理者是有限的,有的条件可能没考虑到。如果处理对象较多,可能影响系统性能。

5. 代码实例

下面假定一个场景:学生需要购买物品,然后向他的导师(教授)进行报销。当总额度不超过1000元时,教授可以自己批准。当总额度介于1000至10000元时,需要教授的上级(系主任)进行批准。当总额度介于10000至50000元时,需要系主任的上级(院长)进行批准。总额度超过50000元的,需要找院长面谈。现编写一个程序,使用责任链模式实现上述功能。

image.png

首先,RequestBuy是实体类,包含购买人、物品名、数量、单价和总金额等信息。

image.png

Superintendent是解决问题的抽象类,里面包括了处理购买和设置上级的方法。

image.png

随后,分别是三个处理问题的实现类:教授类、系主任类和院长类。

image.png

image.png

image.png

然后编写Client进行测试:

image.png

运行结果:

image.png

6. 相关应用

首先,Java中的try-catch异常检测机制就使用了责任链模式,在try中的代码段可以有多个catch进行匹配和处理。除此之外,Spring路由中的过滤器链也采用了责任链模式,当路由访问微服务时先处理默认过滤器,然后处理路由过滤器,最后处理全局过滤器,每个过滤器会根据规则匹配并处理。

更多文章,欢迎访问:www.515code.com/