职责链设计模式

职责链模式又叫命令链、CoR、Chain of Command、Chain of Responsibility。

该模式允许你将请求沿着处理者链进行发送,使多个对象都可以处理请求,每个对象有权决定处理或传递给下个节点。

客户端:用来定义职责链条。

处理者:声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。

具体处理类:处理请求的实际代码,决定是否处理以及向下传递。

接下来阐述下,职责链模式的各级构成,既然是响应请求,首先得有请求。这里以一个采购审批为例子。

1.请求体

请求者类(普通类):包含两个属性(编号:id 和价格:price)

java 复制代码
public class Request {
        //请求编号
	private int id;
        //请求价格
	private float price;
	/**
	 * @param id
	 * @param price
	 */
	public Request(int id, float price) {
		super();
		this.id = id;
		this.price = price;
	}
	public int getId() {
		return id;
	}
	public float getPrice() {
		return price;
	}
}

2.抽象处理类

责任链的抽象处理类,顶层接口只生命,不做具体实现。

java 复制代码
/**
 * 类描述:责任链之抽象处理类
 *
 * @ClassName Handler
 * @Author ward
 * @Date 2023-09-01 18:26
 */
public abstract class Handler {
    //创建实现对象,主要用于被定义
    protected Handler successor;
    //处理者的名称
    String name;

    /**
     * @param name
     * 构造器,传入名称即可
     */
    public Handler(String name) {
        super();
        this.name = name;
    }

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

    //业务处理方法,抽象的
    public abstract void process(ProcureRequest procureRequest);
}

3.具体业务处理类

主任处理类

java 复制代码
/**
 * 类描述:主任处理类
 *
 * @ClassName DirectorHandler
 * @Author ward
 * @Date 2023-09-02 10:54
 */
public class DirectorHandler extends Handler {
    private static final float PRICE = 10000f;

    /**
     * @param name 构造器,传入名称即可
     */
    public DirectorHandler(String name) {
        super(name);
    }

    @Override
    public void process(ProcureRequest procureRequest) {
        //如果金额小于等于10000,由学校主任审批
        if (procureRequest.getPrice() <= PRICE) {
            System.out.println("请求编号: " + procureRequest.getId() + "被" + name + "处理");
        } else {
            System.out.println("请求编号: " + procureRequest.getId() + "," + name + "已签字");
            successor.process(procureRequest);
        }
    }
}

财务处理类

java 复制代码
/**
 * 类描述:财务处理类
 *
 * @ClassName FinanceHandler
 * @Author ward
 * @Date 2023-09-02 10:38
 */
public class FinanceHandler extends Handler {
    private static final float PRICE_1 = 10000f;

    private static final float PRICE_2 = 20000f;
    private static final String name = "财务";

    public FinanceHandler(String name) {
        super(name);
    }

    @Override
    public void process(ProcureRequest procureRequest) {
        //如果金额大于10000,小于20000,由学校财务审批
        if (procureRequest.getPrice() > PRICE_1 && procureRequest.getPrice() <= PRICE_2) {
            System.out.println("请求编号: " + procureRequest.getId() + "被" + name + "处理");
        } else {
            System.out.println("请求编号: " + procureRequest.getId() + "," + name + "已签字");
            successor.process(procureRequest);
        }
    }
}

校长处理类

java 复制代码
/**
 * 类描述:校长处理类
 *
 * @ClassName SchoolMasterHandler
 * @Author ward
 * @Date 2023-09-02 10:56
 */
public class SchoolMasterHandler extends Handler {

    private static final float PRICE = 20000f;
    private static final String name = "校长";

    /**
     * @param name 构造器,传入名称即可
     */
    public SchoolMasterHandler(String name) {
        super(name);
    }

    @Override
    public void process(ProcureRequest procureRequest) {
        //如果金额大于20000,由学校校长审批
        if (procureRequest.getPrice() > PRICE) {
            System.out.println("请求编号: " + procureRequest.getId() + "被" + name + "处理");
        } else {
            System.out.println("请求编号: " + procureRequest.getId() + "," + name + "已签字");
            successor.process(procureRequest);
        }
    }
}

4.客户端

这里就是关于创建完实际处理类之后我们如何去把链条建立起来,其实这个一般是封装起来的,然后。

java 复制代码
/**
 * 类描述:客户端
 *
 * @ClassName Client
 * @Author ward
 * @Date 2023-09-02 11:06
 */
public class Client {
    public static void testChain(int id, int price) {
        //创建请求对象
        ProcureRequest procureRequest = new ProcureRequest(id, price);
        //创建各个处理者
        Handler directorHandler = new DirectorHandler("学校主任");
        Handler financeHandler = new FinanceHandler("学校财务");
        Handler schoolMasterHandler = new SchoolMasterHandler("学校校长");

        //设置链条下一级
        directorHandler.setSuccessor(financeHandler);
        financeHandler.setSuccessor(schoolMasterHandler);

        //开始处理
        directorHandler.process(procureRequest);
    }

    public static void main(String[] args) {
        int[] priceArr = {500, 10001, 20001};
        int id = 1;
        for (int price : priceArr
        ) {
            testChain(id, price);
            id++;
        }
    }

}

5.子标题

正文

css 复制代码
在这里插入代码片
相关推荐
_oP_i33 分钟前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx36 分钟前
android sqlite 数据库简单封装示例(java)
android·java·数据库
武子康1 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
豪宇刘2 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意2 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
FF在路上3 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言
真的很上进3 小时前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
众拾达人4 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
皓木.4 小时前
Mybatis-Plus
java·开发语言
不良人天码星4 小时前
lombok插件不生效
java·开发语言·intellij-idea