在进行请假申请,财务报销申请,需要走部门领导审批,技术总监审批,大领导审批等判断环节。存在请求方和接收方耦合性太强,代码会比较臃肿,不利于扩展和维护。
针对上面,使用责任链模式,将请求方和接收方的业务进行解耦,客户端发送一个请求,由一个抽象的处理请求的类 Handler 来接受这个请求,而具体怎么处理请求,就由 Handler 的子类来完成处理请求方法的实现,每个子类满足条件则自己处理,不满足调用下一个处理子类进行处理,以此类推,形成一条处理的链条。
1.采购请求类
- package com.ljf.day0905;
-
- /**
- * @ClassName: ClientRequest
- * @Description: TODO
- * @Author: admin
- * @Date: 2023/09/05 21:55:41
- * @Version: V1.0
- **/
- public class ClientRequest {
- /* 请求类型 */
- private int type = 0;
- /* 请求金额 */
- private float price = 0.0f;
- /* 请求编号 */
- private int id = 0;
- /**
- * 全参构造
- *
- * @param type
- * @param price
- * @param id
- */
- public ClientRequest(int type, float price, int id) {
- this.type = type;
- this.price = price;
- this.id = id;
- }
- public int getType() {
- return type;
- }
- public float getPrice() {
- return price;
- }
- public int getId() {
- return id;
- }
-
- }
-
2.审批抽象类
- package com.ljf.day0905;
-
- /**
- * @ClassName: Approver
- * @Description: TODO
- * @Author: admin
- * @Date: 2023/09/05 21:56:49
- * @Version: V1.0
- **/
- public abstract class Approver {
- /* 审批人姓名 */
- protected String name;
- /* 下一个审批人 */
- protected Approver approver;
- /**
- * 创建审批人要指定姓名
- *
- * @param name
- */
- public Approver(String name) {
- this.name = name;
- }
- /**
- * 指定下一个审批人
- *
- * @param approver
- */
- public void setApprover(Approver approver) {
- this.approver = approver;
- }
- /**
- * 抽象的审批方法
- *
- * @param purchaseRequest
- */
- public abstract void approve(ClientRequest purchaseRequest);
-
- }
3.子类来继承抽象审批类
3.1 DeaprtLeader
- package com.ljf.day0905;
-
- /**
- * @ClassName: DeaprtLeader
- * @Description: TODO
- * @Author: admin
- * @Date: 2023/09/05 21:58:10
- * @Version: V1.0
- **/
- public class DeaprtLeader extends Approver {
- /**
- * 创建审批人要指定姓名
- *
- * @param name
- */
- public DeaprtLeader(String name) {
- super(name);
- }
- /**
- * 教学主任审批逻辑
- *
- * @param purchaseRequest
- */
- public void approve(ClientRequest purchaseRequest) {
- if (purchaseRequest.getPrice() <= 5000) {
- System.out.println("请求编号:" + purchaseRequest.getId() + "被" +
- this.name + "处理");
- } else {
- approver.approve(purchaseRequest);
- }
- }
-
- }
2.BossLeader
- package com.ljf.day0905;
-
- /**
- * @ClassName: BossLeader
- * @Description: TODO
- * @Author: admin
- * @Date: 2023/09/05 21:59:23
- * @Version: V1.0
- **/
- public class BossLeader extends Approver{
- /**
- * 创建审批人要指定姓名
- *
- * @param name
- */
- public BossLeader(String name) {
- super(name);
- }
- /**
- * 院长审批逻辑
- *
- * @param purchaseRequest
- */
- public void approve(ClientRequest purchaseRequest) {
- if (purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <=
- 10000) {
- System.out.println("请求编号:" + purchaseRequest.getId() + "被" +
- this.name + "处理");
- } else {
- approver.approve(purchaseRequest);
- }
- }
-
- }
3.VicePrincipal
- package com.ljf.day0905;
-
- import com.sun.security.ntlm.Client;
-
- /**
- * @ClassName: VicePrincipal
- * @Description: TODO
- * @Author: admin
- * @Date: 2023/09/05 22:09:25
- * @Version: V1.0
- **/
- public class VicePrincipal extends Approver {
- /**
- * 创建审批人要指定姓名
- *
- * @param name
- */
- public VicePrincipal(String name) {
- super(name);
- }
- /**
- * 副校长审批逻辑
- *
- * @param purchaseRequest
- */
- public void approve(ClientRequest purchaseRequest) {
- if (purchaseRequest.getPrice() > 10000 ) {
- System.out.println("请求编号:" + purchaseRequest.getId() + "被" +
- this.name + "处理");
- } else {
- approver.approve(purchaseRequest);
- }
- }
- }
-
4.测试
- package com.ljf.day0905;
-
- /**
- * @ClassName: TestZe
- * @Description: TODO
- * @Author: admin
- * @Date: 2023/09/05 22:00:19
- * @Version: V1.0
- **/
- public class TestZe {
- public static void main(String[] args) {
-
- // 创建采购请求
- ClientRequest purchaseRequest = new ClientRequest(1, 33310000, 1);
- // 创建审批人
- Approver departmentApprover = new DeaprtLeader("团主任");
- Approver dean = new BossLeader("方院长");
- Approver vicePrincipal = new VicePrincipal("磊副校长");
-
- // Approver principal = new Principal("喜校长");
- // 设置下一个审批人
- departmentApprover.setApprover(dean);
- // 这里要形成一个环链,避免如果 30000 金额以下的请求
- // 直接交给校长处理,会出现空指针
- // 当然,如果程序规定只能从主任开始处理
- // 一层一层最后到校长处理,形成一个单链,这里就不用了设置了
- dean.setApprover(vicePrincipal);
- vicePrincipal.setApprover(departmentApprover);
- // principal.setApprover(departmentApprover);
- // 测试:入口
- departmentApprover.approve(purchaseRequest);
- }
- }
5.结果
