应用场景
在支付系统中,对账是至关重要的一部分
对账分以下几个步骤
1 渠道对账单下载
2 解析对账文件
3 保存解析之后的记录
4 开始处理对账业务
示例代码
责任链模式需要一个总接口,用来定义处理对象的公共部分(一般使用抽象类来定义),
公共部分包括:一个后继处理器,设置和获取后继处理器的方法,具体的请求处理方法(这个方法需要在每个具体处理对象中实现),这里定义为抽象方法。
定义接口
public interface CheckingHandler {
//每个处理者都必须实现处理任务
void handle(CheckLogDto checkLog);
//设置下一个处理者
CheckingHandler setSuccessor(CheckingHandler successor);
}
public abstract class AbstractCheckingHandler implements CheckingHandler{
protected CheckingHandler successor;
public CheckingHandler getSuccessor() {
return successor;
}
@Override
public CheckingHandler setSuccessor(CheckingHandler successor) {
this.successor = successor;
return this.successor;
}
}
定义链节点
@Service
public class BillHandler extends AbstractCheckingHandler {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void handle(CheckLogDto checkLog) {
logger.info("对账单处理");
if (successor != null) {
this.successor.handle(checkLog);
}
}
}
@Service
public class ParseHandler extends AbstractCheckingHandler {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void handle(CheckLogDto checkLogDto) {
// 解析数据
if (successor != null) {
this.successor.handle(checkLogDto);
}
}
@Service
public class PersistenceHandler extends AbstractCheckingHandler {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void handle(CheckLogDto checkLog) {
logger.info("保存对账文件");
saveCheckItems();
if (successor != null) {
this.successor.handle(checkLog);
}
}
@Service
public class CheckHandler extends AbstractCheckingHandler {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void handle(CheckLogDto checkLogDto) {
logger.info("启动对账任务");
checkCore.check();
}
}
最后将链节点串联起来
public class CheckingFactory {
public static CheckingHandler getUmsCheckingHandlerChain() {
ApplicationContext context = SpringUtils.getApplicationContext();
CheckingHandler handler = context.getBean(BillHandler.class);
handler.setSuccessor(context.getBean(ParseHandler.class))
.setSuccessor(context.getBean(PersistenceHandler.class))
.setSuccessor(context.getBean(CheckHandler.class));
return handler;
}
}
外部调用
ChainFactory.getHandlerChain().handler();
外部无需知道内部是怎么实现的