设计模式——责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它将请求的发送者和接收者解耦,使得多个对象都有机会处理请求,而不是指定特定的接收者。在责任链中,每个对象都是一个处理者,对请求进行判断或处理,并且可以将请求传递给链中的下一个处理者。

原理

  • 抽象处理者(Handler): 定义了一个处理请求的接口,包含了一个方法来处理请求以及一个指向下一个处理者的引用。
  • 具体处理者(Concrete Handler): 是抽象处理者的子类,实现请求处理的方法。如果能够处理该请求,则对其进行处理;否则,通过调用下一个处理者的方法将请求传递下去。
  • 客户端(Client): 创建责任链并提交请求到链上的第一个处理者。

Java代码示例

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

    public void setNext(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) {
   
            System.out.println("ConcreteHandlerA handled the request: " + request);
        } else if (nextHandler != null) {
   
            nextHandler.handleRequest(request);
        } else {
   
            System.out.println("Request not handled");
        }
    }
}

// 具体处理者B
public class ConcreteHandlerB extends Handler {
   
    @Override
    public void handleRequest(int request) {
   
        if (request >= 10 && request < 20) {
   
            System.out.println("ConcreteHandlerB handled the request: " + request);
        } else if (nextHandler != null) {
   
            nextHandler.handleRequest(request);
        } else {
   
            System.out.println("Request not handled");
        }
    }
}

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

        // 构建责任链
        handlerA.setNext(handlerB);

        // 提交请求
        handlerA.handleRequest(5);  // ConcreteHandlerA handles it.
        handlerA.handleRequest(15); // ConcreteHandlerB handles it.
        handlerA.handleRequest(25); // No one handles it.
    }
}

想象你正在为一家公司构建一个请假申请审批系统。部门经理、人事主管和CEO都可以审批员工的请假申请。当员工提交申请时,它首先到达部门经理处,如果经理有权批准这个天数的假期则直接处理,否则把申请转交给人事主管,以此类推。在这个例子中,部门经理、人事主管和CEO就形成了一个“责任链”,每个环节都是一个处理者,他们按照一定的顺序处理请求,直到找到合适的审批者为止。

应用

  • 权限系统:不同级别的用户具有不同的权限,请求经过多个角色检查,直到找到有权处理的角色为止。
  • 日志记录器:按级别过滤日志,低级别的处理器不能处理的消息会自动传递给高级别的处理器。
  • 企业审批流程:每一级审批人是一个处理者,根据规则逐级审批或者转交下一级审批。

适用性

  • 请求处理者顺序不确定或动态可变的情况。
  • 一个请求可能由多个对象中的任意一个对象处理,并且希望简化客户端代码,使其不必明确指定处理请求的对象。
  • 需要避免请求发送者与接收者之间的紧耦合,使得系统易于扩展。

相关推荐

  1. 设计模式-责任模式

    2024-01-19 18:22:02       55 阅读
  2. 设计模式——责任模式

    2024-01-19 18:22:02       56 阅读
  3. 设计模式责任模式

    2024-01-19 18:22:02       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-19 18:22:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-19 18:22:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-19 18:22:02       82 阅读
  4. Python语言-面向对象

    2024-01-19 18:22:02       91 阅读

热门阅读

  1. C/C++ 容易混淆的指针声明总结

    2024-01-19 18:22:02       53 阅读
  2. C语言的整形提升规则

    2024-01-19 18:22:02       51 阅读
  3. [力扣 Hot100]Day8 无重复字符的最长子串

    2024-01-19 18:22:02       59 阅读
  4. 【力扣每日一题】力扣2171拿出最少数目的魔法豆

    2024-01-19 18:22:02       59 阅读
  5. leetcode—和为K的子数组

    2024-01-19 18:22:02       55 阅读
  6. 问题解决方案

    2024-01-19 18:22:02       59 阅读
  7. npm install 太慢?解决方法

    2024-01-19 18:22:02       59 阅读
  8. git merge 和 git pull的区别是什么

    2024-01-19 18:22:02       48 阅读
  9. Github Copilot 的使用方法和快捷键

    2024-01-19 18:22:02       71 阅读
  10. 公司OA办公系统使用阿里云服务器怎么选配置?

    2024-01-19 18:22:02       60 阅读
  11. Linux常用命令

    2024-01-19 18:22:02       47 阅读