java设计模式-责任链模式

2020-04-01  本文已影响0人  酷癫

定义

责任链模式是通过很多对象以及对象的下家引用组成的一条链,请求在这条链上传递,直到有对象处理请求,请求的发送者并不知道链上的哪个对象处理的请求,避免发送者和接受者之间的耦合关系,责任链模式的结构如下:

image.png

应用场景

假如一个普通员工发起一个请假申请,当请假天数小于3天,只需主管审批;3天到7天,需要经理审批;当请假大于7天,需要总经理审批。
通过责任链模式实现请假流程的代码如下:
请假对象:

@Data
public class LeaveRequest {

    private String name;

    private int dates;

    private String reason;

    public LeaveRequest(String name, int dates, String reason) {
        this.name = name;
        this.dates = dates;
        this.reason = reason;
    }
}

处理请假抽象类:

public abstract class AbstractHandler {

    protected AbstractHandler nextHandler;

    protected abstract void handler(LeaveRequest leaveRequest);

    protected void setNextHandler(AbstractHandler handler){
        this.nextHandler = handler;
    }
}

主管审批请假:

public class TeamLeaderHandler extends AbstractHandler {
    @Override
    protected void handler(LeaveRequest leaveRequest) {

        if (leaveRequest.getDates() < 3) {
            System.out.println("主管同意请假");
            return;
        }
        if (nextHandler != null) {
            nextHandler.handler(leaveRequest);
        }
    }
}

经理审批请假

public class ManagerHandler extends AbstractHandler {
    @Override
    protected void handler(LeaveRequest leaveRequest) {

        if (leaveRequest.getDates() >= 3 && leaveRequest.getDates() < 7) {
            System.out.println("经理同意请假");
            return;
        }
        if (nextHandler != null) {
            nextHandler.handler(leaveRequest);
        }
    }
}

总经理审批请假

public class TopManagerHandler extends AbstractHandler {
    @Override
    protected void handler(LeaveRequest leaveRequest) {
        if (leaveRequest.getDates() >= 7) {
            System.out.println("总经理同意请假");
            return;
        }
        if (nextHandler != null) {
            nextHandler.handler(leaveRequest);
        }
    }
}

发起请假请求

public class Client {

    public static void main(String[] args) {
        ManagerHandler managerHandler = new ManagerHandler();
        TeamLeaderHandler teamLeaderHandler = new TeamLeaderHandler();
        TopManagerHandler topManagerHandler = new TopManagerHandler();

        teamLeaderHandler.setNextHandler(managerHandler);
        managerHandler.setNextHandler(topManagerHandler);

        LeaveRequest leaveRequest  = new LeaveRequest("张三",1,"回家");
        teamLeaderHandler.handler(leaveRequest);
    }
}

结果:
请假1天:主管同意请假
请假5天:经理同意请假
请假8天:总经理同意请假

责任链模式优点

1.实现请求的发送者和接受者松耦合
2.职责分明,每个对象只需要专注处理自己的事情
3.对象可灵活添加或者删除,以及改变对象的顺序

上一篇下一篇

猜你喜欢

热点阅读