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.对象可灵活添加或者删除,以及改变对象的顺序