当前位置: 首页 > article >正文

JAVA设计模式,责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求的发送者和接收者解耦。在这种模式下,请求沿着责任链传递,直到某个对象能够处理该请求为止。每个对象都有机会处理请求或将其传递给链上的下一个对象。这种模式非常适合处理多步骤或多条件的请求处理流程。

 

### 主要组成部分

 

1. **Handler(处理器)**:定义一个处理请求的接口,通常包含一个`handleRequest`方法。有时候也包含一个指向下一个处理器的引用。

2. **ConcreteHandler(具体处理器)**:实现处理请求的接口。如果能处理,则处理请求;否则,将请求传递给下一个处理器。

3. **Client(客户端)**:创建并连接处理器链,然后向链的起始点发送请求。

 

### 实现步骤

 

1. 定义一个处理器接口。

2. 创建多个具体处理器类,实现处理器接口,并决定是否处理请求或传递给下一个处理器。

3. 在客户端构建处理器链,并发送请求。

 

### 示例代码

 

假设我们有一个审批系统,不同级别的经理可以处理不同金额的报销请求。

 

#### 处理器接口

 

```java

public interface Handler {

    void setNext(Handler next);

    void handleRequest(int amount);

}

```

 

#### 具体处理器

 

```java

public class ManagerA implements Handler {

    private Handler next;

 

    @Override

    public void setNext(Handler next) {

        this.next = next;

    }

 

    @Override

    public void handleRequest(int amount) {

        if (amount <= 500) {

            System.out.println("ManagerA approved the request for " + amount + " yuan.");

        } else if (next != null) {

            next.handleRequest(amount);

        }

    }

}

 

public class ManagerB implements Handler {

    private Handler next;

 

    @Override

    public void setNext(Handler next) {

        this.next = next;

    }

 

    @Override

    public void handleRequest(int amount) {

        if (amount > 500 && amount <= 1000) {

            System.out.println("ManagerB approved the request for " + amount + " yuan.");

        } else if (next != null) {

            next.handleRequest(amount);

        }

    }

}

 

public class ManagerC implements Handler {

    private Handler next;

 

    @Override

    public void setNext(Handler next) {

        this.next = next;

    }

 

    @Override

    public void handleRequest(int amount) {

        if (amount > 1000) {

            System.out.println("ManagerC approved the request for " + amount + " yuan.");

        } else if (next != null) {

            next.handleRequest(amount);

        }

    }

}

```

 

#### 客户端

 

```java

public class Client {

    public static void main(String[] args) {

        Handler managerA = new ManagerA();

        Handler managerB = new ManagerB();

        Handler managerC = new ManagerC();

 

        // 构建责任链

        managerA.setNext(managerB);

        managerB.setNext(managerC);

 

        // 发送请求

        managerA.handleRequest(300); // ManagerA

        managerA.handleRequest(700); // ManagerB

        managerA.handleRequest(1500); // ManagerC

    }

}

```

 

### 运行结果

 

```

ManagerA approved the request for 300 yuan.

ManagerB approved the request for 700 yuan.

ManagerC approved the request for 1500 yuan.

```

 

### 总结

 

责任链模式使得多个对象有机会处理请求,从而避免了请求的发送者和接收者之间的耦合。每个对象都不需要知道链的结构,只需要知道如何将请求传递给下一个对象即可。这种模式非常适合于处理需要多个步骤或条件判断的场景。


http://www.kler.cn/a/421896.html

相关文章:

  • 【Linux系统编程】——理解冯诺依曼体系结构
  • HTML5系列(11)-- Web 无障碍开发指南
  • docker run 设置启动命令
  • 基于C#+SQLite开发数据库应用的示例
  • A109 PHP+MYSQL+LW+网上论坛网站 军事BBS系统的设计与实现 源码+文档 全套 教程
  • 《以 C++为笔,绘就手势识别人机交互新画卷》
  • MySQL删除数据要谨慎
  • Linux(完善中)
  • 基于Matlab三点雨流计数法的载荷时间历程分析与循环疲劳评估
  • URDF(描述机器人模型)和SDF(Gazebo中用于描述仿真环境)
  • 前端request拦截器自定义参数时,后端允许跨域的拦截器要加上对应的自定义参数不然会引起访问跨域
  • 【安卓开发】【Android Studio】项目构建(Build)时报错:Integer Overflow
  • GoReplay工具middlware使用(python版本)
  • 云原生和数据库哪个好一些?
  • case判断年份是否为闰年
  • redis 从16db块 加到32db块
  • Goland2024.3 发布,有点东西
  • 开发一套ERP 第十弹 图片作为配置文件,本地读取图片,定时更新图片类型
  • [高等数学学习记录] 泰勒公式
  • 【Linux】vim编辑器
  • ORB-SLAM2 ----- LocalMapping::ComputeF12和ORBmatcher::CheckDistEpipolarLine
  • C++ 封闭函数局部变量不能在 lambda 体中引用,除非其位于捕获列表中
  • Golang教程第25篇(并发)
  • G0、G1、G2连续在曲线和曲面的设计和制造中重要性体现在哪里
  • 工业智能网关在该企业中的应用实践
  • 【Leetcode 每日一题】LCR 190. 加密运算