设计模式——责任链模式

原理

请求顺着责任链顺序执行,直到有一个节点处理了请求,或者没有任何节点处理请求。

上面说的是纯责任链,还有一种是不纯责任链,某个节点处理一部分,剩下的交给后面节点处理。

优点

  1. 解耦
  2. 添加、删除节点灵活

应用场景

某员工请假,需要项目经理、部门经理、总经理审批,每一级拥有的审批天数额度不同,需要先项目经理审批,请假天数超过审批权限时,交给部门经理审批,如果超出部门经理审批权限,则最后由总经理审批。

上代码


/**
 * 抽象处理者
 */
public abstract class Handler {
    // 项目经理额度天数1天
    protected double PMDays = 1;
    // 部门经理额度天数3天
    protected double BMDays = 3;
    // 总经理额度天数5天
    protected double GMDays = 5;
    // 领导名
    private String leaderName;
    // 下一个处理者
    private Handler handler;

    public Handler(String leaderName) {
        this.leaderName = leaderName;
    }

    public String getLeaderName() {
        return this.leaderName;
    }

    public void setNextHandler(Handler handler) {
        this.handler = handler;
    }

    public Handler getNextHandler() {
        return this.handler;
    }

    /**
     * 定义抽象处理方法
     *
     * @param leaveDays
     */
    public abstract void handleRequest(double leaveDays);
}
复制代码
/**
 * 项目经理处理者
 */
public class PMHandler extends Handler {
    public PMHandler(String leaderName) {
        super(leaderName);
    }

    @Override
    public void handleRequest(double leaveDays) {
        if (leaveDays <= PMDays) {
            System.out.println("你只请了" + leaveDays + "天的假期," + getLeaderName() + "说:准了!!!");
        } else {
            getNextHandler().handleRequest(leaveDays);
        }
    }
}

复制代码
/**
 * 部门经理处理者
 */
public class BMHandler extends Handler {
    public BMHandler(String leaderName) {
        super(leaderName);
    }

    @Override
    public void handleRequest(double leaveDays) {
        if (leaveDays <= BMDays) {
            System.out.println("你只请了" + leaveDays + "天的假期," + getLeaderName() + "说:准了!!!");
        } else {
            getNextHandler().handleRequest(leaveDays);
        }
    }
}

复制代码
/**
 * 总经理处理者
 */
public class GMHandler extends Handler {
    public GMHandler(String leaderName) {
        super(leaderName);
    }

    @Override
    public void handleRequest(double leaveDays) {
        if (leaveDays <= GMDays) {
            System.out.println("你只请了" + leaveDays + "天的假期," + getLeaderName() + "说:准了!!!");
        } else {
            System.out.println("你请的天数过长,超出公司允许范畴,予以驳回!!!");
        }
    }
}
复制代码
public class Context {
    public static void main(String[] args) {
        PMHandler pmHandler = new PMHandler("项目经理");
        BMHandler bmHandler = new BMHandler("部门经理");
        GMHandler gmHandler = new GMHandler("总经理");
        bmHandler.setNextHandler(gmHandler);
        pmHandler.setNextHandler(bmHandler);

        pmHandler.handleRequest(0.5);
    }
}

复制代码
结果:
你只请了0.5天的假期,项目经理说:准了!!!
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享