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

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

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

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

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站。

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

相关推荐
编程修仙5 分钟前
第一篇 认识SpringBoot
java·spring boot
骇客野人9 分钟前
.gitignore文件常用设置
java
bill44717 分钟前
BPMN2.0,flowable工作流,【用户任务】使用【任务监听器】动态设置下一步处理人
java·工作流引擎·flowable·bpmn
Cricyta Sevina18 分钟前
Java 语言多线程核心概念全解析
java·开发语言
shenzhenNBA26 分钟前
如何在python文件中使用日志功能?简单版本
java·前端·python·日志·log
C7211BA32 分钟前
GoF提出的经典设计模式
设计模式
遇印记43 分钟前
javaOCA考点(基础)
java·开发语言·青少年编程
阿里云云原生1 小时前
告别“看不见的内存”!SysOM 如何实现 Java 进程内存全景分析?
java·云原生