跳转至

责任链模式

分类:行为型模式。

类结构

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

协作过程

  1. 装配代码把处理器连成一条链,MailClient 保存入口引用。
  2. 来信先交给入口;当前处理器判断是否属于自己负责的类别。
  3. 匹配时完成删除或部门分流,并结束这封邮件的处理。
  4. 不匹配时转交后继;链末仍无法分类的邮件可交人工处理,这是本模型补充的兜底策略。

场景来源(Google Books 原书公开检索片段;示例类图为本笔记整理):

评论