Java设计模式——责任链模式

2020-11-18  本文已影响0人  132xin

定义

责任链模式属于行为模式,为请求创建了一个接收者对象的链,这种模式给于请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依次类推。或者如果某个接收者处理完之后,还需要传递到下一个接收者继续处理或者返回处理完毕

主要解决

职责链上的处理者与接收者耦合在一起,让多个对象都有可能接收到请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

优点

缺点

使用场景

示例

场景

小明所在的公司,请假需要领导进行审批,如果请假天数半天到1天,需要主管审批,如果请假1到3天,主管审批完之后,还需要部门经理审批。请假3到30天的,主管和部门经历审批完之后,还需要总经理进行处理。

角色
UML类图
image.png
实现步骤
public abstract class AbstractHandler {
    /**
     * 需主管审批的天数
     */
    protected final static int  MIN=1;

    /**
     * 需部门经理审批的天数
     */
    protected final static int MIDDLE=3;

    /**
     * 需总经理历审批的天数
     */
    protected  final static int MAX=30;


    protected AbstractHandler nextHandler;

    /**
     * 设置下一个审批者
     * @param nextHandler
     */
    protected void setNextHandler(AbstractHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    /**
     * 需要子类进行重写
     * @param request
     */
    public abstract void handlerRequest(LeaveRequest request);
}

public class DirectLeaderHandler extends AbstractHandler {
    @Override
    public void handlerRequest(LeaveRequest request) {
        if(request.getLeaveDays()<=MIN){
            System.out.println("部门主管:已审批 请假申请通过");
            return;
        }
        //请假天数大于1天,需要继续传递到部门经理进行审批
        if (request.getLeaveDays()> MIN){
            if(nextHandler!=null){
                System.out.println("部门主管:已审批 还需要部门经理审批");
                nextHandler.handlerRequest(request);
            }
        }
    }
}

public class DeptManagerHandler extends  AbstractHandler{
    @Override
    public void handlerRequest(LeaveRequest request) {
        if(request.getLeaveDays()<=MIDDLE){
            System.out.println("部门经理:已审批 请假申请通过");
            return;
        }
        //请假天数大于3天,需要继续传递到总经理进行审批
        if (request.getLeaveDays()> MIDDLE){
            if(nextHandler!=null){
                System.out.println("部门经理:已审批 还需要总经理审批");
                nextHandler.handlerRequest(request);
            }
        }
    }
}
public class GManagerHandler extends AbstractHandler{

    @Override
    public void handlerRequest(LeaveRequest request) {
        if(request.getLeaveDays()<=MAX){
            System.out.println("总经理:已审批 请假申请通过");
            return;
        }
         //如果大于30天的,根据具体的需要进行处理
        if (request.getLeaveDays()> MAX){

        }
    }
}

/**
 * 请假的请求类
 */
public class LeaveRequest {
    /**
     * 请假的天数
     */
    private int leaveDays;

    /**
     * 请假人的名字
     */
    private String name;

    public LeaveRequest leaveDays(int days){
       this.leaveDays=days;
        return  this;
    }
    public LeaveRequest name(String name){
        this.name=name;
        return this;
    }

    public int getLeaveDays() {
        return leaveDays;
    }

    public String getName() {
        return name;
    }
}

 public static void main(String[] args){
        GManagerHandler gManagerHandler=new GManagerHandler();
        DirectLeaderHandler directLeaderHandler=new DirectLeaderHandler();
        DeptManagerHandler deptManagerHandler=new DeptManagerHandler();
        deptManagerHandler.setNextHandler(gManagerHandler);
        directLeaderHandler.setNextHandler(deptManagerHandler);

        LeaveRequest request=new LeaveRequest().leaveDays(18).name("小明");
        System.out.println(request.getName()+"发起请"+request.getLeaveDays()+"天假的申请");
        directLeaderHandler.handlerRequest(request);

        LeaveRequest request2=new LeaveRequest().leaveDays(1).name("小红");
        System.out.println(request2.getName()+"发起请"+request2.getLeaveDays()+"天假的申请");
        directLeaderHandler.handlerRequest(request2);

        LeaveRequest request3=new LeaveRequest().leaveDays(2).name("小亮");
        System.out.println(request3.getName()+"发起请"+request3.getLeaveDays()+"天假的申请");
        directLeaderHandler.handlerRequest(request3);

    }

结果:

小明发起请18天假的申请
部门主管:已审批 还需要部门经理审批
部门经理:已审批 还需要总经理审批
总经理:已审批 请假申请通过
小红发起请1天假的申请
部门主管:已审批 请假申请通过
小亮发起请2天假的申请
部门主管:已审批 还需要部门经理审批
部门经理:已审批 请假申请通过

参考连接:
https://www.jianshu.com/p/9f7d9775bdda

上一篇 下一篇

猜你喜欢

热点阅读