行为型 中等

责任链模式

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

责任链模式的主要目的是什么?