职责链设计模式在java8中的实现方式
先看一下传统的职责链设计模式实现方式,经典责任链模式请假流程代码这里借用同行,然后我们再来看java8下职责链设计模式实现同样功能的代码。话不多说,见代码:
1、实际被处理的请求对象类
//实际被处理对象
public class ParamVO {
private String type; // 请求类型
private int days; // 天数
private String remarks; // 备注
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getDays() {
return days;
}
public void setDays(int days) {
this.days = days;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
public ParamVO(String type, int days, String remarks) {
super();
this.type = type;
this.days = days;
this.remarks = remarks;
}
}
2、处理策略类,所有要处理的逻辑写在此类里,每个逻辑是一个单独的方法
//职责实际处理类,如果前面一个处理成功,后面就不处理,则要做一个处理成功的标识
//考虑处理成功后将被处理对象置为null
public class Strategy {
// 经理处理策略
public static ParamVO fun1(ParamVO paramVO) {
if (paramVO == null) {
return null;
}
// 经理能处理2天以内的请假申请
if (paramVO.getDays() <= 2) {
System.out.println("经理开始处理 >>>>>>>");
System.out.println("因" + paramVO.getRemarks() + ",需请假" + paramVO.getDays() + "天,已批准。");
return null;
} else {
// 处理不了的传递给上级
System.out.println("经理处理不了,需上级处理 >>>>>>>");
return paramVO;
}
}
// 总监处理策略
public static ParamVO fun2(ParamVO paramVO) {
if (paramVO == null) {
return null;
}
// 总监能处理5天以内的请假申请
if (paramVO.getDays() <= 5) {
System.out.println("总监开始处理 >>>>>>>");
System.out.println("因" + paramVO.getRemarks() + ",需请假" + paramVO.getDays() + "天,已批准。");
return null;
} else {
// 处理不了的传递给上级
System.out.println("总监处理不了,需上级处理 >>>>>>>");
return paramVO;
}
}
// 总经理处理策略
public static ParamVO fun3(ParamVO paramVO) {
if (paramVO == null) {
return null;
}
// 总经理能处理任意天以内的请假申请
System.out.println("总经理开始处理 >>>>>>>");
System.out.println("因" + paramVO.getRemarks() + ",需请假" + paramVO.getDays() + "天,已批准。");
return null;
}
}
3、测试类,职责链的初始化和请求对象的初始化,执行逻辑
public // 测试类
class Test {
public static void main(String[] args) {
Function<ParamVO, ParamVO> initfunction = x -> Strategy.fun1(x);
Function<ParamVO, ParamVO> function = initfunction.andThen(Strategy::fun2).andThen(Strategy::fun3);
System.out.println("流程1开始 >>>>>>>>");
ParamVO paramVO = new ParamVO("请假", 1, "生病请假");
function.apply(paramVO);
System.out.println("流程2开始 >>>>>>>>");
ParamVO paramVO1 = new ParamVO("请假", 5, "休息");
function.apply(paramVO1);
System.out.println("流程3开始 >>>>>>>>");
ParamVO paramVO2 = new ParamVO("请假", 10, "休假");
function.apply(paramVO2);
}
}
4、打印执行结果
流程1开始 >>>>>>>> 经理开始处理 >>>>>>> 因生病请假,需请假1天,已批准。 流程2开始 >>>>>>>> 经理处理不了,需上级处理 >>>>>>> 总监开始处理 >>>>>>> 因休息,需请假5天,已批准。 流程3开始 >>>>>>>> 经理处理不了,需上级处理 >>>>>>> 经理处理不了,需上级处理 >>>>>>> 总经理开始处理 >>>>>>> 因休假,需请假10天,已批准。