设计模式使用场景实现示例及优缺点(行为型模式——责任链模式)

责任链模式(Chain of Responsibility Pattern)

责任链模式是一种行为设计模式,允许对象将请求沿着处理器链传递,直到一个处理器决定处理该请求为止。这种模式的核心在于解耦发送者和接收者之间的关系,通过多个对象共同处理一个请求,从而避免将一个请求的发送者和接收者耦合在一起。

核心组件

  • Handler(处理器):定义了处理请求的接口,并可实现后继链。
  • ConcreteHandler(具体处理器):具体处理器实现处理请求的接口,如果该处理器不能处理请求,则将其传递给链中的下一个处理器。
  • Client(客户端):通常构造链并向链的首个处理器发送请求。

适用场景

  1. 当有多个对象可以处理一个请求,而发送者不需要明确知道哪一个对象将会处理该请求时
    • 责任链模式使得请求的发送者和接收者解耦。
  2. 当需要动态指定一组对象处理请求时
    • 可以动态地增加或修改处理链。
  3. 当处理请求的顺序重要时
    • 可以控制请求在链中的传递顺序。

实现实例

以客户支持系统为例,不同级别的支持人员处理不同级别的客户请求。

处理器接口(Handler Interface)

Handler 类是一个抽象类,定义了处理请求的方法 handleRequest() 和设置后继处理器的方法 setSuccessor()

java 复制代码
public abstract class Handler {
    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(Request request);
}
  • handleRequest(Request request) 方法用于处理请求,每个具体处理器根据具体条件决定是否处理请求。
  • setSuccessor(Handler successor) 方法用于设置当前处理器的后继处理器,以构建责任链。

具体处理器(Concrete Handler)

具体处理器类继承自 Handler 类,根据特定条件判断是否能够处理请求,如果不能则传递给后继者。

ConcreteHandler1
java 复制代码
public class ConcreteHandler1 extends Handler {
    public void handleRequest(Request request) {
        if (request.getValue() < 10) { // 判断条件:处理值小于10的请求
            System.out.println("ConcreteHandler1 handled request " + request.getValue());
        } else if (successor != null) {
            successor.handleRequest(request); // 如果无法处理,则传递给后继者
        }
    }
}
ConcreteHandler2
java 复制代码
public class ConcreteHandler2 extends Handler {
    public void handleRequest(Request request) {
        if (request.getValue() >= 10 && request.getValue() < 20) { // 判断条件:处理值在10到20之间的请求
            System.out.println("ConcreteHandler2 handled request " + request.getValue());
        } else if (successor != null) {
            successor.handleRequest(request); // 如果无法处理,则传递给后继者
        }
    }
}

客户端代码(Client Code)

客户端代码创建具体处理器实例,并构建责任链,然后发起请求。

java 复制代码
public class Client {
    public static void main(String[] args) {
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        h1.setSuccessor(h2); // 设置责任链

        Request request = new Request(15); // 创建请求
        h1.handleRequest(request); // 开始处理请求
    }
}

在客户端代码中,首先创建了两个具体处理器实例 ConcreteHandler1ConcreteHandler2,然后通过 setSuccessor() 方法将它们连接起来形成责任链。最后创建一个请求对象并调用第一个处理器的 handleRequest() 方法开始处理请求。

责任链模式允许请求在多个对象之间传递,直到找到合适的处理器为止。这种设计方式使得系统更加灵活和可扩展,每个处理器可以独立变化而不影响整个处理流程。

优缺点

优点
  1. 降低耦合度
    • 责任链模式使得一个请求的发送者和接收者之间不必有明确的联系。
  2. 增加了请求处理对象的灵活性
    • 可以动态地添加或修改处理链。
缺点
  1. 请求可能不被处理
    • 如果没有任何处理器处理请求,它可能会在链的末端被丢弃。
  2. 性能问题
    • 在某些情况下,请求在链中的传递可能会导致延迟。

类图

复制代码
+----------------+           +------------------+
|   Handler      |---------> |   ConcreteHandler|
+----------------+           +------------------+
| + handleRequest()          | + handleRequest()|
| + setSuccessor()           |                  |
+----------------+           +------------------+
|                |           |
+----------------+           |
                             |
      +-------------------+--------+----------------+
      |                   |                 |                |
+----------------+ +----------------+ +----------------+ +--------------+
|Handler1         | |ConcreteHandler1| |ConcreteHandler2| | ...          |
+----------------+ +----------------+ +----------------+ +--------------+
| + handleRequest()| | + handleRequest()| | + handleRequest()| | + handleRequest()|
+----------------+ +----------------+ +----------------+ +--------------+

总结

责任链模式提供了一种将请求沿着一条链进行传递的机制,通过这种方式可以解耦请求的发送者和接收者。这种模式特别适用于有多个对象可能处理同一个请求时,允许请求沿链传递直到一个对象处理它为止。

相关推荐
鱼跃鹰飞7 小时前
设计模式系列:工厂模式
java·设计模式·系统架构
老蒋每日coding14 小时前
AI Agent 设计模式系列(十九)—— 评估和监控模式
人工智能·设计模式
会员果汁15 小时前
23.设计模式-解释器模式
设计模式·解释器模式
「QT(C++)开发工程师」1 天前
C++设计模式
开发语言·c++·设计模式
茶本无香1 天前
设计模式之七—装饰模式(Decorator Pattern)
java·设计模式·装饰器模式
漂洋过海的鱼儿1 天前
设计模式——EIT构型(三)
java·网络·设计模式
老蒋每日coding2 天前
AI Agent 设计模式系列(十八)—— 安全模式
人工智能·安全·设计模式
老蒋每日coding2 天前
AI Agent 设计模式系列(十六)—— 资源感知优化设计模式
人工智能·设计模式·langchain
老蒋每日coding2 天前
AI Agent 设计模式系列(十七)—— 推理设计模式
人工智能·设计模式
冷崖2 天前
桥模式-结构型
c++·设计模式