设计模式-责任链模式

一 责任链模式

       责任链模式(Chain of Responsibility Pattern)是属于行为型的设计模式,它通过将请求沿着对象链传递直到全部的对象处理完为止,使得每个接收者对象都有机会处理请求。这种模式允许对请求的处理解耦,并且让多个对象可以参与处理过程。

角色与结构:

1 Handler(抽象处理器)

  • 定义了处理请求的接口,通常包含两个方法:setNext(Handler) 用于设置下一个处理器,以及 handleRequest(Request) 用于处理请求。

2 ConcreteHandler(具体处理器)

  • 是 Handler 接口的实现类,每个 ConcreteHandler 都负责处理某种特定类型的请求。
  • 每个 ConcreteHandler 在处理请求时,可以根据请求的具体内容选择自己处理还是将请求传递给下一个处理器。

工作原理:

  • 当一个请求发送到责任链的第一个处理器时,该处理器首先检查是否能够处理这个请求。如果可以,就进行处理并结束流程;如果不能,就将请求传递给下一个处理器,以此类推,直到找到能够处理该请求的处理器,或者到达链的末端。

示例代码:

责任链java实现示例代码:

// 抽象处理器
public abstract class Handler {
    protected Handler nextHandler;

    public void setNextHandler(Handler handler) {
        this.nextHandler = handler;
    }

    public abstract void handleRequest(int request);
}

// 具体处理器A
public class ConcreteHandlerA extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request < 10) { // 处理小于10的请求
            System.out.println("ConcreteHandlerA handled request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request); // 将大于等于10的请求转发给下一个处理器
        }
    }
}

// 具体处理器B
public class ConcreteHandlerB extends Handler {
    @Override
    public void handleRequest(int request) {
        if (request < 20 && nextHandler == null) { // 处理10到19的请求
            System.out.println("ConcreteHandlerB handled request: " + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request); // 将大于等于20的请求转发给下一个处理器
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();

        handlerA.setNextHandler(handlerB);

        handlerA.handleRequest(5); // 输出 "ConcreteHandlerA handled request: 5"
        handlerA.handleRequest(15); // 输出 "ConcreteHandlerB handled request: 15"
        handlerA.handleRequest(30); // 因为没有后续处理器,所以不会有任何输出
    }
}

说明:在上面的代码中当客户端发起一个请求时,请求首先被 ConcreteHandlerA 处理。如果请求值小于10,由 ConcreteHandlerA 直接处理;否则,请求会被转发给 ConcreteHandlerB。若请求值仍然不在 ConcreteHandlerB 的处理范围内且没有后续处理器,请求将不再继续传递。

优点:

  • 松散耦合:请求者和处理器之间不直接相互依赖,它们通过责任链间接交互。
  • 灵活扩展:可以很容易地在系统运行时动态添加或删除处理器节点。
  • 可重用性:每个处理器可以独立于其他处理器被复用。

应用场景:

  • 权限系统中权限级别的审批流,如低级别管理员无法处理的请求会自动转交给高级别管理员。
  • 日志记录系统,不同严重级别的日志可能会被不同的处理器处理。
  • GUI 中事件处理机制,例如鼠标点击事件可能依次触发一系列组件上的事件处理器。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qyhua

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

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

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

打赏作者

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

抵扣说明:

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

余额充值