责任链模式¶
分类:行为型模式。
类结构¶
classDiagram
direction TB
class Client
class Handler {
<<abstract>>
#Handler next
+setNext(Handler next)
+handle(Request request)*
}
class ConcreteHandlerA {
+handle(Request request)
}
class ConcreteHandlerB {
+handle(Request request)
}
Client ..> Handler : 发起请求
Handler --> "0..1" Handler : 后继处理者
Handler <|-- ConcreteHandlerA
Handler <|-- ConcreteHandlerB
角色定义¶
| 角色 | 定义 |
|---|---|
| Client(客户) | 把请求交给链上的入口处理者,无需依赖最终处理请求的具体对象。 |
| Handler(抽象处理者) | 定义处理请求的接口,持有可选的后继处理者,并提供设置后继的操作。 |
| ConcreteHandlerA / ConcreteHandlerB(具体处理者) | 判断是否处理请求,并按规则将请求交给后继;链的转发和终止条件由具体实现决定。 |
Head First 示例:Mighty Gumball 的邮件分流¶
《Head First Design Patterns》第一版附录 Leftover Patterns 用 Mighty Gumball 的来信处理说明责任链:粉丝来信交给 CEO,投诉交给法务,请求新增糖果机投放地点的邮件交给业务拓展部门,垃圾邮件直接删除。
下面是依据这个场景整理的**教学建模**。MailClient、EmailHandler 及四种处理器的类名、方法和排列由本笔记定义,不是作者配套源码。示意链先过滤垃圾邮件,再判断其他类别;每个处理器处理自己认识的邮件,否则转交后继。
| 示例类型 | 模式角色 | 职责 |
|---|---|---|
| MailClient | 客户 | 接收来信,并将邮件交给链的入口。 |
| EmailHandler | 抽象处理者 | 提供处理与设置后继的操作,保存可选的下一个处理器。 |
| SpamHandler | 具体处理者 | 识别并删除垃圾邮件;未命中则继续传递。 |
| FanHandler | 具体处理者 | 把粉丝来信交给 CEO。 |
| ComplaintHandler | 具体处理者 | 把投诉交给法务部门。 |
| NewLocationHandler | 具体处理者 | 把新增投放地点请求交给业务拓展部门。 |
示例 UML¶
classDiagram
direction TB
class MailClient {
+receive(Email email)
}
class EmailHandler {
<<abstract>>
#EmailHandler next
+setNext(EmailHandler next)
+handle(Email email)*
}
class SpamHandler {
+handle(Email email)
}
class FanHandler {
+handle(Email email)
}
class ComplaintHandler {
+handle(Email email)
}
class NewLocationHandler {
+handle(Email email)
}
MailClient --> EmailHandler : 提交来信
EmailHandler --> "0..1" EmailHandler : 后继
EmailHandler <|-- SpamHandler
EmailHandler <|-- FanHandler
EmailHandler <|-- ComplaintHandler
EmailHandler <|-- NewLocationHandler
协作过程¶
- 装配代码把处理器连成一条链,
MailClient保存入口引用。 - 来信先交给入口;当前处理器判断是否属于自己负责的类别。
- 匹配时完成删除或部门分流,并结束这封邮件的处理。
- 不匹配时转交后继;链末仍无法分类的邮件可交人工处理,这是本模型补充的兜底策略。
场景来源(Google Books 原书公开检索片段;示例类图为本笔记整理):