1.业务场景:和外部对接中需要传送订单数据给其他三方系统。由于订单有多种状态每次变更都需要同步,但是对方同一个订单只能创建一次,第二次只能更新。由于我方也不想存那些订单推送给他,所以每次都是先无脑创建订单然后再更新一次。
2代码示例:
调用入口:
@Service
@Slf4j
public class EicOrderStrategyService {
@Autowired
EicOrderCreateProcessor eicOrderCreateProcessor;
@Autowired
EicOrderUpdateProcessor eicOrderUpdateProcessor;
public void doSend(OrderRootXml xml) {
//创建订单
eicOrderCreateProcessor.setSuccessor(eicOrderUpdateProcessor).handleRequest(xml, "tokenDto.getAccessToken()");
}
}
父类:
@Getter
@Setter
public abstract class EicOrderProcessor<T extends OrderRootXml> {
@Getter
protected EicOrderProcessor successor;
public abstract Optional<OrderRootXml> handleRequest(T root, Object... args);
public EicOrderProcessor setSuccessor(EicOrderProcessor successor) {
this.successor = successor;
return this;
}
}
创建订单:
@Service
@Slf4j
public class EicOrderCreateProcessor extends EicOrderProcessor<OrderRootXml> {
@Override
public Optional<OrderRootXml> handleRequest(OrderRootXml root, Object... args) {
//创建订单
ExceptionUtils.doActionLogE(() -> createOrder(args[0].toString(), root));
//update order
if (getSuccessor() != null) {
return getSuccessor().handleRequest(root, args);
}
return Optional.empty();
}
}
更新订单:
@Service
@Slf4j
public class EicOrderUpdateProcessor extends EicOrderProcessor<OrderRootXml> {
@Override
public Optional<OrderRootXml> handleRequest(OrderRootXml root, Object... args) {
//更新订单
ExceptionUtils.doActionLogE(() -> updateOrder(args[0].toString(), root));
if (getSuccessor() != null) {
return getSuccessor().handleRequest(root, args);
}
return Optional.empty();
}
}