行为型 中等
责任链模式
Chain of Responsibility Pattern
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
概述
责任链模式是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。
适用场景
- •当程序需要使用不同方式处理不同种类的请求时
- •当必须按顺序执行多个处理者时
优点
- +可以控制请求处理的顺序
- +单一职责原则:可将发起操作和执行操作的类进行解耦
- +开闭原则:可以在不更改现有代码的情况下在程序中新增处理者
缺点
- −部分请求可能未被处理
- −如果链过长,可能会影响性能
结构
classDiagram
class Handler {
<<interface>>
+setNext(handler: Handler): Handler
+handle(request: Request): string
}
class BaseHandler {
-nextHandler: Handler
+setNext(handler: Handler): Handler
+handle(request: Request): string
}
class ConcreteHandlerA {
+handle(request: Request): string
}
class ConcreteHandlerB {
+handle(request: Request): string
}
class ConcreteHandlerC {
+handle(request: Request): string
}
class Client {
+main()
}
class Request {
+type: string
+content: string
}
Handler <|.. BaseHandler
BaseHandler <|-- ConcreteHandlerA
BaseHandler <|-- ConcreteHandlerB
BaseHandler <|-- ConcreteHandlerC
BaseHandler o--> Handler : next
Client ..> Handler : uses
Client ..> Request : creates
style Handler fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
style BaseHandler fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
style ConcreteHandlerA fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
style ConcreteHandlerB fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
style ConcreteHandlerC fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
style Client fill:#f5f5f5,stroke:#616161,stroke-width:1px
style Request fill:#fff3e0,stroke:#f57c00,stroke-width:1px
交互演示
将请求沿处理链传递
请求
HandlerALow
HandlerBMedium
HandlerCHigh
等待处理...
选择请求级别,观察它如何在处理链中找到合适的处理器
生活类比
责任链就像是技术支持热线
技术支持
你的问题首先由一线客服处理,如果解决不了,就转给二线技术支持,再不行就转给工程师。
代码实现
Example.java
实际应用
Java Servlet Filter
Java Servlet 的 FilterChain 是责任链模式的典型应用。
Example.java
练习
1