尚硅谷设计模式学习(24)---[职责链模式(Chain of Responsibility Pattern)]

本文通过一个学校OA系统的采购审批案例,介绍了如何利用职责链模式解决审批流程中的耦合问题。在传统的解决方案中,审批过程需要多次判断,而职责链模式则允许每个审批者只处理其职责范围内的请求,超出范围则传递给下一级审批者,从而实现灵活的审批链。案例中,从教导主任到校长,每个审批角色都有相应的审批金额范围,并通过设置下一个审批者来构建链条。通过这种方式,代码更易于扩展和维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

尚硅谷传送门==>B站尚硅谷Java设计模式

❤❤❤感谢尚硅谷❤❤❤

最近开始计划学习一下设计模式了,加油!!!



情景引入

首先看一个案例

学校OA系统的采购审批项目:需求是

  • 1 采购员采购教学器材
  • 2 如果金额 小于等于5000, 由教学主任审批 (0<=x<=5000)
  • 3 如果金额 小于等于10000, 由院长审批 (5000<x<=10000)
  • 4 如果金额 小于等于30000, 由副校长审批 (10000<x<=30000)
  • 5 如果金额 超过30000以上,有校长审批 ( 30000<x)

要是按照传统的方式解决的话.

每次都要进行判断,然后决定具体去找对应的审批检验人,要是到时候判断的条件改了,这个对应关系的依赖也要改动.
采购请求进行处理 和 审批人产生强耦合关系,不利于代码的扩展和维护

在这里插入图片描述

那么,来看看职责链模式


职责链模式

每个接收者都包含对另一个接收者的引用;如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,形成一个链条.
(就像过滤器一样)

需要注意的是;要控制链中最大节点数量,节点过多可能会影响性能,一般通过在Handler中设置一个最大节点数量.

原理图

在这里插入图片描述


OK,继续回到之前的材料审批问题

在这里插入图片描述

需要处理的请求类SchoolRequest

//学校的购买请求;
public class SchoolRequest {
    //请求的类型;
    private String type = null;
    //请求的大概金额;
    private float price=0.0f;
    //Id;
    private int  id=0;

    //初始化;
    public SchoolRequest(String type, float price, int id) {
        this.type = type;
        this.price = price;
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public float getPrice() {
        return price;
    }

    public int getId() {
        return id;
    }
}

审批者Approver

/**
 * @author by 优快云@小智RE0
 */

//审批者
public abstract class Approver {
    //聚合,下一个处理的审批者;
    Approver approver;
    //当前审批者的部门名;
    String name;

    //初始化;
    public Approver(String name) {
        this.name = name;
    }

    //设置下一个审批者到底是谁;
    public void setApprover(Approver approver) {
        this.approver = approver;
    }

    //处理请求的办法;
    public  abstract void  HandlingTheRequest(SchoolRequest schoolRequest);
}

教导主任审批DirectorApprover

/**
 * @author by 优快云@小智RE0
 */

//教导主任审批;
public class DirectorApprover extends Approver{
    //初始化;
    public DirectorApprover(String name) {
        super(name);
    }

    public void HandlingTheRequest(SchoolRequest schoolRequest) {
        if(schoolRequest.getPrice()<=5000){
            System.out.println(this.name+"表示能处理这个项目-->"+schoolRequest.getType());
            System.out.println("项目Id为==>"+schoolRequest.getId());
        }
        else {
            System.out.println(this.name+"表示不行,你去找院长-->");
            approver.HandlingTheRequest(schoolRequest);
        }
    }
}

院长审批DeanApprover

/**
 * @author by 优快云@小智RE0
 */
//院长审批;
public class DeanApprover extends Approver{
    //初始化;
    public DeanApprover(String name) {
        super(name);
    }

    public void HandlingTheRequest(SchoolRequest schoolRequest) {
        if(schoolRequest.getPrice()>5000 && schoolRequest.getPrice()<=10000){
            System.out.println(this.name+"表示能处理这个项目-->"+schoolRequest.getType());
            System.out.println("项目Id为==>"+schoolRequest.getId());
        }else {
            System.out.println(this.name+"表示不行,你去找副校长吧");
            approver.HandlingTheRequest(schoolRequest);
        }
    }
}

副校长审批VicePresidentApprover

/**
 * @author by 优快云@小智RE0
 */

//副校长审批;
public class VicePresidentApprover extends Approver {
    //初始化;
    public VicePresidentApprover(String name) {
        super(name);
    }

    public void HandlingTheRequest(SchoolRequest schoolRequest) {
        if( schoolRequest.getPrice()>10000 && schoolRequest.getPrice()<=30000){
            System.out.println(this.name+"表示能处理这个项目-->"+schoolRequest.getType());
            System.out.println("项目Id为==>"+schoolRequest.getId());
        }else {
            System.out.println(this.name+"表示不行,你去找校长吧");
            approver.HandlingTheRequest(schoolRequest);
        }
    }
}

校长审批PresidentApprover

/**
 * @author by 优快云@小智RE0
 */
//校长审批;
public class PresidentApprover extends Approver{
    //初始化;
    public PresidentApprover(String name) {
        super(name);
    }

    public void HandlingTheRequest(SchoolRequest schoolRequest) {
        if(schoolRequest.getPrice()>30000){
            System.out.println(this.name+"表示能处理这个项目-->"+schoolRequest.getType());
            System.out.println("项目Id为==>"+schoolRequest.getId());
        }else {
            approver.HandlingTheRequest(schoolRequest);
        }
    }
}

模拟客户端

/**
 * @author by 优快云@小智RE0
 */

//模拟客户端;
public class Client {
    public static void main(String[] args) {
        //提出请求;
        SchoolRequest schoolRequest = new SchoolRequest("采购教学用品",60000,0);

        Approver directorApprover = new DirectorApprover("教导主任");
        Approver deanApprover = new DeanApprover("院长");
        Approver vicePresidentApprover = new VicePresidentApprover("副校长");
        Approver presidentApprover = new PresidentApprover("校长");

        //设置好下一个处理的人;
        directorApprover.setApprover(deanApprover);
        deanApprover.setApprover(vicePresidentApprover);
        vicePresidentApprover.setApprover(presidentApprover);
        presidentApprover.setApprover(directorApprover);

        //教导主任收到请求时;
        directorApprover.HandlingTheRequest(schoolRequest);

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小智RE0-走在路上

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

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

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

打赏作者

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

抵扣说明:

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

余额充值