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

责任链模式(Chain of Responsibility Pattern)

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

核心组件

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

适用场景

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

实现实例

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

处理器接口(Handler Interface)

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

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
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
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)

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

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
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值