场景:当你需要报销的时候,各级部门有审核限制,所以不同的报销金额,从下往上审核
package designpatterns.chain.excise;
import lombok.Data;
import java.util.Objects;
/**
* 抽象报销处理器
*/
@Data
public abstract class AbstractFlowHandler {
private AbstractFlowHandler nextHandler;
/**
* 审批
* @param param
* @return
*/
public abstract boolean approve(MoneyPayVO param);
/**
* 链路传递
* @param param
* @return
*/
protected boolean next(MoneyPayVO param) {
//下一个链路没有处理器了,直接返回
if (Objects.isNull(nextHandler)) {
return true;
}
//执行下一个处理器
return nextHandler.approve(param);
}
}
/**
* 审批上下文客户端
*/
public class HandlerClient {
public static boolean executeChain(AbstractFlowHandler handler,MoneyPayVO moneyPayVO) {
//执行处理器
boolean handlerResult = handler.approve(moneyPayVO);
if (!handlerResult) {
System.out.println("HandlerClient 责任链执行失败返回:" + handlerResult);
return false;
}
return true;
}
}
package designpatterns.chain.excise;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class MoneyPayVO {
private String name;
private BigDecimal money;
public MoneyPayVO(String name, BigDecimal money) {
this.name = name;
this.money = money;
}
}
package designpatterns.chain.excise;
import java.math.BigDecimal;
public class OneLevelFlowHandler extends AbstractFlowHandler {
@Override
public boolean approve(MoneyPayVO param) {
if (param.getMoney().compareTo(new BigDecimal(500)) < 0) {
System.out.println("三級部门审批");
return true;
}
System.out.println("交给二級部门审批");
return super.next(param);
}
}
package designpatterns.chain.excise;
import java.math.BigDecimal;
public class ThreeLevelFlowHandler extends AbstractFlowHandler {
@Override
public boolean approve(MoneyPayVO param) {
if (param.getMoney().compareTo(new BigDecimal(7500)) < 0) {
System.out.println("一級部门审批");
return true;
}
return super.next(param);
}
}
package designpatterns.chain.excise;
import java.math.BigDecimal;
public class TwoLevelFlowHandler extends AbstractFlowHandler {
@Override
public boolean approve(MoneyPayVO param) {
if (param.getMoney().compareTo(new BigDecimal(2500)) < 0) {
System.out.println("二級部门审批");
return true;
}
System.out.println("交给一級部门审批");
return super.next(param);
}
}
测试代码
package designpatterns.chain.excise;
import java.math.BigDecimal;
public class executeChain {
public static void main(String[] args) {
OneLevelFlowHandler oneLevelFlowHandler = new OneLevelFlowHandler();
TwoLevelFlowHandler twoLevelFlowHandler = new TwoLevelFlowHandler();
ThreeLevelFlowHandler threeLevelFlowHandler = new ThreeLevelFlowHandler();
oneLevelFlowHandler.setNextHandler(twoLevelFlowHandler);
twoLevelFlowHandler.setNextHandler(threeLevelFlowHandler);
HandlerClient.executeChain(oneLevelFlowHandler,new MoneyPayVO("小明",new BigDecimal(1000)));
//或者
oneLevelFlowHandler.approve(new MoneyPayVO("小明",new BigDecimal(1000)));
}
}