设计模式之责任链模式讲解

概念:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。最匹配的场景应该就是逐层审批的模式。

责任链模式只有两个角色,一个抽象处理类,一个具体处理类。这个模式的关键在于多个处理类层层持有,形成一个链条,并各自处理职责内的请求。

下面以一个请假审批的例子,帮助大家理解该模式。

java 复制代码
public abstract class Approver {
    protected Approver nextApprover;
    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }
    public abstract void processRequest(LeaveRequest request);
}

public class TeamLead extends Approver {
    @Override
    public void processRequest(LeaveRequest request) {
        if (request.getDays() <= 2) {
            System.out.println("团队领导审批 " + request.getDays() + " 天假.");
        } else if (nextApprover != null) {
            System.out.println("发送上级经理审批。");
            nextApprover.processRequest(request);
        } else {
            System.out.println("超出团队领导审批权限。");
        }
    }
}

public class Manager extends Approver {
    @Override
    public void processRequest(LeaveRequest request) {
        if (request.getDays() <= 5) {
            System.out.println("经理审批 " + request.getDays() + " 天假.");
        } else if (nextApprover != null) {
            System.out.println("发送总监审批");
            nextApprover.processRequest(request);
        } else {
            System.out.println("超出经理审批范围");
        }
    }
}

public class Director extends Approver {
    @Override
    public void processRequest(LeaveRequest request) {
        if (request.getDays() <= 10) {
            System.out.println("总监审批 " + request.getDays() + " 天假.");
        } else {
            System.out.println("超出总监审批范围。");
        }
    }
}

public class LeaveRequest {
    private String employeeName;
    private int days;
    public LeaveRequest(String employeeName, int days) {
        this.employeeName = employeeName;
        this.days = days;
    }
    public String getEmployeeName() {
        return employeeName;
    }
    public int getDays() {
        return days;
    }
}

public class Demo {
    public static void main(String[] args) {
        TeamLead teamLead = new TeamLead();
        Manager manager = new Manager();
        Director director = new Director();
        teamLead.setNextApprover(manager);
        manager.setNextApprover(director);
        LeaveRequest request1 = new LeaveRequest("天哥", 2);
        LeaveRequest request2 = new LeaveRequest("天哥", 5);
        LeaveRequest request3 = new LeaveRequest("天哥", 10);
        LeaveRequest request4 = new LeaveRequest("天哥", 15);
        teamLead.processRequest(request1);
        System.out.println("**************************分割线*************************************");
        teamLead.processRequest(request2);
        System.out.println("**************************分割线*************************************");
        teamLead.processRequest(request3);
        System.out.println("**************************分割线*************************************");
        teamLead.processRequest(request4);
    }
}

如果大家需要视频版本的讲解,欢迎大家关注我的B站。

十五、设计模式之命令模式讲解

相关推荐
YoseZang20 分钟前
【设计模式】GoF设计模式之策略模式(Strategy Pattern)
设计模式·策略模式
世纪摆渡人23 分钟前
设计模式-策略模式(Strategy Pattern)
设计模式·策略模式
可儿·四系桜1 小时前
WebSocket:实时通信的新时代
java·网络·websocket·网络协议
forestsea1 小时前
Maven 插件机制与生命周期管理
java·maven
七月在野,八月在宇,九月在户1 小时前
maven 依赖冲突异常分析
java·maven
金融数据出海1 小时前
黄金、碳排放期货市场API接口文档
java·开发语言·spring boot·后端·金融·区块链
胡斌附体1 小时前
微服务中 本地启动 springboot 无法找到nacos配置 启动报错
java·spring boot·微服务·yml·naocs yml
薯条不要番茄酱1 小时前
【JVM】从零开始深度解析JVM
java·jvm
夏季疯2 小时前
学习笔记:黑马程序员JavaWeb开发教程(2025.3.31)
java·笔记·学习
yangyang_z2 小时前
【C++设计模式之Observer观察者模式】
c++·观察者模式·设计模式