设计模式 - 责任链模式
封面图
•
2026-03-28
•
设计模式
22
0
0
0
**责任链模式(Chain of Responsibility Pattern)** --- ### 一、定义 **责任链模式**是一种行为设计模式,它允许你将请求的发送者和接收者解耦。通过将请求沿着一条链传递,直到有对象处理它为止。这种模式使得多个对象都有机会处理请求,而无需明确指定处理者。 --- ### 二、核心思想 - **请求的发送者**(Client)不直接与接收者(Handler)通信。 - 请求被封装成一个**对象**,然后沿着**责任链**传递。 - 每个处理者(Handler)决定是否处理请求,或者将其传递给下一个处理者。 --- ### 三、结构组成 责任链模式通常包含以下几个角色: 1. **Handler(抽象处理者)** - 定义一个处理请求的接口,通常包含一个指向下一个处理者的引用(`next`)。 - 提供一个处理方法(如 `handleRequest()`),并可能包含默认的处理逻辑。 2. **ConcreteHandler(具体处理者)** - 实现 `handleRequest()` 方法,决定是否处理该请求。 - 如果可以处理,则处理;否则将请求传递给下一个处理者。 3. **Client(客户端)** - 创建责任链,并向链中的第一个处理者发送请求。 --- ### 四、类图示意 ``` +-------------------+ | Handler | +-------------------+ | - next: Handler | +-------------------+ | + handleRequest() | +-------------------+ / \ / \ +--------------+ +--------------+ | ConcreteHandlerA | | ConcreteHandlerB | +--------------+ +--------------+ | + handleRequest() | | + handleRequest() | +--------------+ +--------------+ ``` --- ### 五、优点 - **解耦请求的发送者和接收者**,降低耦合度。 - **增强系统的可扩展性**,可以动态地添加或删除处理者。 - **符合开闭原则**,易于新增新的处理者。 --- ### 六、缺点 - **性能问题**:如果链太长,可能会导致性能下降。 - **调试困难**:因为请求的处理流程不是显式的,调试时不易追踪。 --- ### 七、适用场景 - 需要对请求进行多级处理,但不知道具体的处理者是谁。 - 多个对象有权限处理同一个请求,但需要按顺序处理。 - 需要动态地添加或移除处理者。 --- ### 八、Java 示例代码 ```java // 抽象处理者 abstract class Handler { protected Handler next; public void setNext(Handler next) { this.next = next; } public abstract void handleRequest(String request); } // 具体处理者 A class ConcreteHandlerA extends Handler { @Override public void handleRequest(String request) { if (request.equals("A")) { System.out.println("ConcreteHandlerA 处理了请求"); } else if (next != null) { next.handleRequest(request); } } } // 具体处理者 B class ConcreteHandlerB extends Handler { @Override public void handleRequest(String request) { if (request.equals("B")) { System.out.println("ConcreteHandlerB 处理了请求"); } else if (next != null) { next.handleRequest(request); } } } // 客户端 public class Client { public static void main(String[] args) { Handler handlerA = new ConcreteHandlerA(); Handler handlerB = new ConcreteHandlerB(); // 构建责任链 handlerA.setNext(handlerB); // 发送请求 handlerA.handleRequest("A"); // 输出: ConcreteHandlerA 处理了请求 handlerA.handleRequest("B"); // 输出: ConcreteHandlerB 处理了请求 handlerA.handleRequest("C"); // 无输出(未被处理) } } ``` --- ### 九、实际应用案例 - **日志系统**:不同级别的日志(DEBUG、INFO、ERROR)由不同的处理器处理。 - **权限验证**:用户登录后,依次检查权限。 - **过滤器链**:如 Java Servlet 中的 Filter 链。 - **事件处理机制**:GUI 事件在控件之间传递。 --- ### 十、总结 责任链模式非常适合用于需要将多个对象组合成一个处理链的场景。它提升了系统的灵活性和可维护性,但也需要注意避免链过长带来的性能问题。 如果你需要我用其他语言(如 Python、C++、C#)实现示例,也可以告诉我!
上一篇:
设计模式 - 代理模式
标题录入,一次不能超过6条
留言
评论