电商下单流程的模块化重构实践
电商系统的下单接口通常包含复杂业务逻辑,本文通过设计模式优化流程结构。原始流程涉及库存、优惠券和活动处理,存在扩展性差和维护困难的问题。
模板方法模式实现校验逻辑
针对条件执行场景(如优惠券校验),抽象公共操作流程:
public interface OrderProcessor {
void validate(Context ctx);
void prepare(Context ctx);
void commit(Context ctx);
void rollback(Context ctx);
}
public abstract class BaseProcessor implements OrderProcessor {
protected abstract boolean shouldExecute(Context ctx);
protected abstract void executeValidate(Context ctx);
// 其他操作类似
@Override
public final void validate(Context ctx) {
if(shouldExecute(ctx)) {
executeValidate(ctx);
}
}
// 其他方法实现类似
}
public class CouponProcessor extends BaseProcessor {
@Override
protected boolean shouldExecute(Context ctx) {
return ctx.hasCoupon();
}
@Override
protected void executeValidate(Context ctx) {
// 具体优惠券校验逻辑
}
}
责任链模式整合处理单元
通过Spring自动装配实现处理链:
@Service
public class OrderService {
@Autowired
private List<BaseProcessor> processors;
private void executeOperation(Consumer<BaseProcessor> action, Context ctx) {
processors.forEach(processor -> action.accept(processor));
}
}
策略模式支持多订单类型
针对不同订单类型实现差异化处理:
public interface OrderSubmitStrategy {
void processOrder(Context ctx);
}
public class StandardOrderStrategy implements OrderSubmitStrategy {
@Override
public void processOrder(Context ctx) {
// 标准订单处理
}
}
public class ExternalOrderStrategy implements OrderSubmitStrategy {
@Override
public void processOrder(Context ctx) {
// 外部系统订单处理
}
}
观察者模式实现事件通知
解耦下单后处理逻辑:
public interface OrderListener {
void afterOrderSubmit(Context ctx);
}
@Service
public class NotificationService {
@Autowired
private List<OrderListener> listeners;
public void notifyListeners(Context ctx) {
listeners.forEach(listener -> listener.afterOrderSubmit(ctx));
}
}
public class AnalyticsListener implements OrderListener {
@Override
public void afterOrderSubmit(Context ctx) {
// 发送数据分析事件
}
}
最终下单流程:
public void submitOrder(Context ctx, OrderSubmitStrategy strategy) {
executeOperation(p -> p.validate(ctx), ctx);
executeOperation(p -> p.prepare(ctx), ctx);
try {
strategy.processOrder(ctx);
executeOperation(p -> p.commit(ctx), ctx);
} catch (Exception e) {
executeOperation(p -> p.rollback(ctx), ctx);
throw e;
}
notifyListeners(ctx);
}