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

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

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

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

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

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

相关推荐

  1. 设计模式责任讲解

    2024-04-09 06:10:05       41 阅读
  2. 【前端设计模式责任模式

    2024-04-09 06:10:05       75 阅读
  3. python模式设计责任模式

    2024-04-09 06:10:05       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 06:10:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 06:10:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 06:10:05       82 阅读
  4. Python语言-面向对象

    2024-04-09 06:10:05       91 阅读

热门阅读

  1. 设计模式:责任链模式示例

    2024-04-09 06:10:05       35 阅读
  2. wpf ResourceDictionary的MergedDictionaries

    2024-04-09 06:10:05       42 阅读
  3. rust实现一个post小程序

    2024-04-09 06:10:05       40 阅读
  4. 设计模式:生活中的责任链模式

    2024-04-09 06:10:05       38 阅读
  5. 【Python】OPC UA 服务器与客户端的实现

    2024-04-09 06:10:05       38 阅读
  6. 【使用 Qt 实现计算器】

    2024-04-09 06:10:05       30 阅读
  7. WKWebView生成PDF

    2024-04-09 06:10:05       33 阅读
  8. 算力服务器租用的费用包含哪些方面?

    2024-04-09 06:10:05       31 阅读
  9. python实现假设检验-z检验

    2024-04-09 06:10:05       36 阅读
  10. 国内镜像源拉取Ubuntu,并实现网络配置

    2024-04-09 06:10:05       40 阅读
  11. Python的学习之路

    2024-04-09 06:10:05       38 阅读
  12. RFID详解

    2024-04-09 06:10:05       37 阅读
  13. C语言的数组

    2024-04-09 06:10:05       33 阅读
  14. 速盾:游戏cdn什么意思

    2024-04-09 06:10:05       41 阅读