当前位置:   article > 正文

设计模式十四:用一个请假流程的例子说清楚责任链模式_请假设计模式

请假设计模式


设计模式一: 《用一个营销策略的实例说清楚策略模式的应用场景》
设计模式二: 《用一个股票买卖的例子说清楚观察者模式》
设计模式三: 《用一个苏式面条的实例说清楚装饰者模式》
设计模式四: 《用一个生产手机的简单例子说清楚工厂模式》
设计模式五: 《用不同的实现方式创建单例模式》
设计模式六: 《用一个遥控开关的例子说清楚命令模式》
设计模式七: 《用一个USB转换器的例子说清楚适配器模式》
设计模式八: 《用一个银行存取款的例子说清楚模板方法模式》
设计模式九: 《研究Java集合类的Iterator迭代器理解迭代器模式》
设计模式十: 《用一个组织架构的例子说清楚组合模式》
设计模式十二: 《用一个中介卖房的例子说清楚代理模式》
设计模式十三: 《用一个组配吃鸡电脑的例子说清楚建造者模式》

一、背景

  • 责任链模式,顾名思义就是将责任串成了一组链条,主要重在责任分离处理,让各个链条中的节点能各司其职。
  • 责任链模式一般用于处理流程节点之类的实际业务场景中,该文将一个实际的请假流程来进行说明。

二、请假流程

  • 从以下流程中,我们可以看到,申请请假时,需要部门负责人,分公司负责人,人力资源负责人批准通过,如果请假天数大于3天的,最终还要总经理进行批准。
    在这里插入图片描述
  • 接下来我们用责任链模式来设计该请假流程
  1. 请假申请类
/**
 * 请假申请
 */
public class Leave {

    // 请假人
    private String name;

    // 请假天数
    private int days;

    public Leave(String name, int days) {
        this.name = name;
        this.days = days;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getDays() {
        return days;
    }

    public void setDays(int days) {
        this.days = days;
    }

    @Override
    public String toString() {
        return this.getName()+"请假"+this.getDays()+"天";
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  1. 请假审批抽象类:所有主管的请假审批都继承于此类
/**
 * 请假审批抽象类
 */
public abstract class LeaveHandler {

    // 需要总经理批准的请假天数
    protected   int MANAGER_LEAVE_REQUEST_DAYS=3;

    // 主管名字
    private String name;

    // 审批意见
    private boolean approved;

    public LeaveHandler(String name) {
        this.name = name;
    }

    // 下一节点
    protected LeaveHandler next;

    // 处理请假
    public abstract void handle(Leave request);

    // 设置下一节点
    protected LeaveHandler setNextHandler(LeaveHandler handler){
        this.next = handler;
        return next;
    }

    public LeaveHandler getNext() {
        return next;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public  int getManagerLeaveRequestDays() {
        return MANAGER_LEAVE_REQUEST_DAYS;
    }

    public void setApproved(boolean approved) {
        this.approved = approved;
    }

    public boolean getApproved() {
        return approved;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  1. 部门主管审批类:部门主管批准通过后需要向分公司领导进行审批
/**
 * 部门主管处理请假
 */
public class DepartmentLeaveHandler extends LeaveHandler{

    public DepartmentLeaveHandler(String name) {
        super(name);
    }

    @Override
    public void handle(Leave request) {
        if (this.getApproved()){
            System.out.println(this.getName()+"审批通过:"+request.toString());

            if (this.next!=null){
                this.next.handle(request);
            }

        }else{
            System.out.println(this.getName()+"审批拒绝:"+request.toString());
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. 分公司领导审批类:如果请假人请假天数大于3天,则需要总经理批准
/**
 * 分公司领导处理请假
 */
public class CompanyLeaveHandler extends LeaveHandler {

    public CompanyLeaveHandler(String name) {
        super(name);
    }

    @Override
    public void handle(Leave request ) {
        if (this.getApproved()) {
            System.out.println(this.getName() + "审批通过:"+request.toString());

            // 如果超过三天,需要总经理审批
            if (this.next != null && request.getDays() > this.getManagerLeaveRequestDays()) {
                this.next.handle(request);
            }

        } else {
            System.out.println(this.getName() + "审批拒绝:"+request.toString());
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  1. 总经理批准
/**
 * 总经理请假处理
 */
public class ManagerLeaveHandler extends LeaveHandler {

    public ManagerLeaveHandler(String name) {
        super(name);
    }

    @Override
    public void handle(Leave request ) {
        if (this.getApproved()){
            System.out.println(this.getName()+"审批通过:"+request.toString());

            if (this.next!=null){
                this.next.handle(request);
            }

        }else{
            System.out.println(this.getName()+"审批拒绝:"+request.toString());
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

三、请假测试

  1. 例子:张三申请请假4天,部门主管同意,分公司领导同意,总经理审批拒绝
/**
 * 请假流程测试
 */
public class TestLeave {

    public static void main(String[] args) {

        // 形成责任链
        DepartmentLeaveHandler departmentLeaveHandler = new DepartmentLeaveHandler("部门主管");
        CompanyLeaveHandler companyLeaveHandler = new CompanyLeaveHandler("分公司领导");
        ManagerLeaveHandler managerLeaveHandler = new ManagerLeaveHandler("总经理");
        departmentLeaveHandler.setNextHandler(companyLeaveHandler).setNextHandler(managerLeaveHandler);

        // 张三请假4天
        Leave leave1 = new Leave("张三",4);
        // 部门主管同意
        departmentLeaveHandler.setApproved(true);
        // 分公司领导同意
        companyLeaveHandler.setApproved(true);
        // 总经理审批拒绝
        managerLeaveHandler.setApproved(false);
        departmentLeaveHandler.handle(leave1);

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

在这里插入图片描述

  1. 例子:李四申请请假1天,部门主管同意,分公司领导同意
/**
 * 请假流程测试
 */
public class TestLeave {

    public static void main(String[] args) {

        // 形成责任链
        DepartmentLeaveHandler departmentLeaveHandler = new DepartmentLeaveHandler("部门主管");
        CompanyLeaveHandler companyLeaveHandler = new CompanyLeaveHandler("分公司领导");
        ManagerLeaveHandler managerLeaveHandler = new ManagerLeaveHandler("总经理");
        departmentLeaveHandler.setNextHandler(companyLeaveHandler).setNextHandler(managerLeaveHandler);

        // 张三请假4天
        Leave leave1 = new Leave("李四",2);
        departmentLeaveHandler.setApproved(true);
        companyLeaveHandler.setApproved(true);
        departmentLeaveHandler.handle(leave1);

    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

4、总结

在这里插入图片描述

  • 以上用责任链模式创建的流程的各个节点都有机会处理请求,但也有可能得不到受理请求的机会。
  • 责任链中的每个节点都相互独立,各司其责,有利于程序后续的扩展及修改。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/525969
推荐阅读
相关标签
  

闽ICP备14008679号