使用原因
因为最近接手了开放品台计费功能,里面涉及到多级扣费,用传统的方式耦合度太高,故采用了责任链的方式。
创建抽象类
public abstract class CostHandler {
public abstract CostHandler getNextHandler();
public abstract void setNextHandler(CostHandler nextHandler);
public abstract CommonResponse dealRequest(CostObj obj);
}
在这里要创建CostObj实体类用于向责任链传递具体属性。
创建责任链消费顺序
@Getter
@AllArgsConstructor
public enum HandlerBeanEnum {
/**
* 枚举顺序不能随意改变
**/
NEWUSER_COST_HANDLER("NewUserCostHandler"),
ACTIVITY_COST_HANDLER("ActivityCostHandler"),
AMOUNT_COST_HANDLER("AmountCostHandler");
private String beanName;
}
职责处理器
@Component
public class ExecuteHandler {
@Autowired
private ApplicationContext context;
private List<CostHandler> handlerList = new LinkedList<>();
private CostHandler handler;
public CostHandler getHandler() {
return handler;
}
/**
* 该方法会在该对象创建之后被调用
*/
@PostConstruct
public void afterPostConstruct() {
HandlerBeanEnum[] values = HandlerBeanEnum.values();
for (HandlerBeanEnum value : values) {
CostHandler bean = context.getBean(value.getBeanName(), CostHandler.class);
handlerList.add(bean);
}
if (handlerList != null && handlerList.size() > 0) {
for (int i = 1; i < handlerList.size(); i++) {
//当前处理器
CostHandler currentHandler = handlerList.get(i - 1);
//下一个处理器
CostHandler nextHandler = handlerList.get(i);
//将处理器串成链表
currentHandler.setNextHandler(nextHandler);
}
this.handler = handlerList.get(0);
}
}
}
上面的基本框架搭建好后,就要开始写具体的业务代码
@Component("ActivityCostHandler")
public class ActivityCostHandler extends CostHandler {
private static final MobvoiLog logger = new MobvoiLog(ActivityCostHandler.class);
private CostHandler nextHandler;
@Override
public CostHandler getNextHandler() {
return nextHandler;
}
@Override
public void setNextHandler(CostHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public CommonResponse dealRequest(CostObj obj) {
CommonResponse commonResponse = new CommonResponse(0, Constants.SUCCESS);
boolean flag = voucherBilling(obj.getVoucher(), obj.getService(), obj.getWordCount(),
obj.getAppId(), obj.getAppName(), obj.getWwid(), obj.getAppKey());
//如果金额代金劵消费完返回true,走下一个责任链
if (flag) {
nextHandler.dealRequest(obj);
}
return commonResponse;
}
/**
* 代金劵消费
*/
下面的两种业务层代码相似,故不在重复。