大白话说Java设计模式-48-综合实战上:下单全链路设计模式应用
2026/9/13 22:24:39 网站建设 项目流程

📌大厂规范:Java项目工具类 — 06_UUID生成工具类(Java企业级代码)

大白话说Java设计模式-48-综合实战上:下单全链路设计模式应用

📌一句话本质:下单全链路是设计模式的"试金石",7 大经典模式协同作战。

🏷️ 标签:综合实战 / 下单全链路 / 设计模式协作 / 大白商城 🎯 适合:所有 Java 工程师


目录

  • 一、为什么需要"综合实战"?
  • 二、下单全链路流程图
  • 三、7 大设计模式协作
  • 四、完整代码实战
  • 五、模式之间的协作关系
  • 六、本篇小结 + 下篇预告

一、为什么需要"综合实战"?

从 02 篇到 47 篇,我们系统讲了 23 种 GoF 设计模式。但真实业务不是单模式——下单全链路用到了7 大模式协同:

  • 单例:Spring 容器管理 Bean
  • 策略:支付方式(4 种)
  • 状态:订单状态机(6 种)
  • 责任链:风控链(5 步)
  • 观察者:订单事件(6 个 Listener)
  • 模板方法:下单流程骨架
  • 享元:商品标签(5+ 共享)

这一篇我们用大白商城真实下单流程串起来,画龙点睛


二、下单全链路流程图

用户下单 ↓ ┌──────────────────────────────────────┐ │ Controller 层(外观模式) │ │ OrderController.createOrder() │ └──────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 风控链(责任链) │ │ BlackList → Frequency → Fraud │ │ → Compliance → HighRisk │ └──────────────┬───────────────────────┘ ↓ 通过 ┌──────────────────────────────────────┐ │ 订单服务(模板方法) │ │ AbstractOrderProcessor.processOrder() │ │ ├── beforeProcess │ │ ├── createOrder(创建订单) │ │ ├── decreaseStock(减库存) │ │ ├── pay(支付:策略模式) │ │ ├── notify(通知:观察者模式) │ │ └── afterProcess │ └──────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 支付(策略模式) │ │ PaymentContext.pay(channel) │ │ ├── AlipayStrategy │ │ ├── WechatStrategy │ │ ├── UnionPayStrategy │ │ └── DigitalRmbStrategy │ └──────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 订单状态机(状态模式) │ │ PAID → SHIPPED → COMPLETED │ └──────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 事件通知(观察者模式) │ │ OrderPaidEvent │ │ ├── StockListener(减库存) │ │ ├── PointsListener(加积分) │ │ ├── LogisticsListener(准备发货) │ │ ├── PushListener(推送) │ │ ├── StatisticsListener(统计) │ │ └── AuditListener(审计) │ └──────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 商品标签(享元模式) │ │ GoodsTag("热销"/"新品"/"包邮"共享) │ └──────────────────────────────────────┘

三、7 大设计模式协作

3.1 模式一:单例(Spring Bean)

/** * ✅ 单例:Spring Bean 默认单例 * <p> * OrderService / OrderController / 各 Listener 都是单例 */@ServicepublicclassOrderService{// 整个 JVM 只有一个 OrderService 实例}

作用:节省内存,Spring 自动管理。

3.2 模式二:策略(支付方式)

/** * ✅ 策略:支付方式 */publicinterfacePaymentStrategy{PaymentResultpay(PaymentRequestrequest);StringgetChannel();}@ComponentpublicclassAlipayStrategyimplementsPaymentStrategy{...}@ComponentpublicclassWechatStrategyimplementsPaymentStrategy{...}

作用:加新支付方式只加 1 个 Strategy。

3.3 模式三:状态(订单状态机)

/** * ✅ 状态:订单 6 状态 */publicinterfaceOrderState{voidpay(Orderorder);voidship(Orderorder);voidcancel(Orderorder);voidcomplete(Orderorder);}@ComponentpublicclassPendingPayStateimplementsOrderState{...}@ComponentpublicclassPaidStateimplementsOrderState{...}

作用:加新状态只加 1 个 State 类。

3.4 模式四:责任链(风控)

/** * ✅ 责任链:风控 5 步 */publicinterfaceRiskHandler{voidhandle(RiskContextcontext,RiskChainchain);}@ComponentpublicclassBlackListHandlerimplementsRiskHandler{...}@ComponentpublicclassFrequencyHandlerimplementsRiskHandler{...}

作用:加新风控规则只加 1 个 Handler。

3.5 模式五:观察者(订单事件)

/** * ✅ 观察者:订单事件 */publicclassOrderPaidEventextendsApplicationEvent{...}@ComponentpublicclassStockListener{@EventListenerpublicvoidonOrderPaid(OrderPaidEventevent){...}}@ComponentpublicclassPointsListener{@EventListenerpublicvoidonOrderPaid(OrderPaidEventevent){...}}

作用:加新事件订阅只加 1 个 Listener。

3.6 模式六:模板方法(下单骨架)

/** * ✅ 模板方法:下单流程 */publicabstractclassAbstractOrderProcessor{publicfinalOrderResultprocessOrder(OrderContextcontext){// 1️⃣ 钩子beforeProcess(context);// 2️⃣ 抽象方法Orderorder=createOrder(context);// 3️⃣ 抽象方法decreaseStock(order,context);// 4️⃣ 抽象方法pay(order,context);// 5️⃣ 抽象方法notify(order,context);// 6️⃣ 钩子afterProcess(context,result);returnresult;}protectedabstractOrdercreateOrder(OrderContextcontext);protectedabstractvoiddecreaseStock(Orderorder,OrderContextcontext);protectedabstractvoidpay(Orderorder,OrderContextcontext);protectedabstractvoidnotify(Orderorder,OrderContextcontext);}

作用:通用流程只写 1 次,子类填差异。

3.7 模式七:享元(商品标签)

/** * ✅ 享元:商品标签 */@ComponentpublicclassTagFactory{privatefinalConcurrentHashMap<String,Tag>tagPool=newConcurrentHashMap<>();publicTaggetTag(Stringname){returntagPool.computeIfAbsent(name,this::createTag);}}

作用:100 万件商品的 500 万个标签,从 5GB 降到 50MB。


四、完整代码实战

4.1 Controller(外观)

/** * ✅ 外观:统一对外接口 */@RestController@RequestMapping("/api/order")publicclassOrderController{@AutowiredprivateOrderServiceorderService;@AutowiredprivateRiskControlServiceriskService;@PostMapping("/create")publicOrderResultcreateOrder(@RequestBodyOrderRequestrequest){// 1️⃣ 风控链RiskResultriskResult=riskService.check(buildRiskContext(request));if(!riskResult.isApproved()){returnOrderResult.failed(riskResult.getReason());}// 2️⃣ 下单(模板方法)returnorderService.createOrder(request);}}

4.2 Service(模板方法)

/** * ✅ Service:模板方法调用方 */@ServicepublicclassOrderService{@AutowiredprivateList<AbstractOrderProcessor>processors;publicOrderResultcreateOrder(OrderRequestrequest){// 1️⃣ 选模板(按订单类型)AbstractOrderProcessorprocessor=selectProcessor(request);// 2️⃣ 调模板方法returnprocessor.processOrder(buildContext(request));}}

4.3 风控链(责任链)

/** * ✅ 风控:责任链 */@ServicepublicclassRiskControlService{@AutowiredprivateBlackListHandlerblackListHandler;@AutowiredprivateFrequencyHandlerfrequencyHandler;publicRiskResultcheck(RiskContextcontext){List<RiskHandler>handlers=List.of(blackListHandler,frequencyHandler);RiskChainchain=newRiskChain(handlers);returnchain.process(context);}}

4.4 支付(策略)

/** * ✅ 支付:策略 */@ServicepublicclassPaymentContext{privatefinalMap<String,PaymentStrategy>strategyMap=newHashMap<>();@AutowiredpublicPaymentContext(List<PaymentStrategy>strategies){strategies.forEach(s->strategyMap.put(s.getChannel(),s));}publicPaymentResultpay(Stringchannel,PaymentRequestrequest){returnstrategyMap.get(channel).pay(request);}}

4.5 状态机(状态)

/** * ✅ 状态:订单状态机 */@ComponentpublicclassOrderStateMachine{@AutowiredprivateApplicationEventPublishereventPublisher;publicvoidchangeState(Orderorder,OrderEventevent){// 1️⃣ 改状态OrderStateoldState=order.getState();event.applyTo(order);OrderStatenewState=order.getState();// 2️⃣ 发事件eventPublisher.publishEvent(newOrderStateChangedEvent(this,order.getOrderId(),oldState.getStateName(),newState.getStateName()));}}

4.6 事件订阅(观察者)

/** * ✅ 观察者:事件订阅 */@ComponentpublicclassStockListener{@EventListenerpublicvoidonOrderPaid(OrderPaidEventevent){log.info("【库存】扣减, orderId={}",event.getOrderId());// 减库存}}@ComponentpublicclassPointsListener{@EventListenerpublicvoidonOrderPaid(OrderPaidEventevent){log.info("【积分】增加, orderId={}",event.getOrderId());// 加积分}}

五、模式之间的协作关系

下单全链路用了哪些模式? │ ├── 1. 外观(Facade) │ └── OrderController 统一对外 │ ├── 2. 责任链(Chain of Responsibility) │ └── RiskControlService 风控 5 步 │ ├── 3. 模板方法(Template Method) │ └── AbstractOrderProcessor 下单骨架 │ ├── 4. 策略(Strategy) │ └── PaymentContext 支付 4 种 │ ├── 5. 状态(State) │ └── OrderStateMachine 订单 6 态 │ ├── 6. 观察者(Observer) │ └── ApplicationEvent 6 个 Listener │ ├── 7. 单例(Singleton) │ └── Spring Bean 默认单例 │ ├── 8. 享元(Flyweight) │ └── TagFactory 标签共享 │ └── 9. 工厂方法(Factory Method) └── SelectProcessor 选模板

5.1 模式协作图

┌──────────────────────────────────────┐ │ Controller(外观) │ └──────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 风控(责任链) │ └──────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 模板方法(骨架) │ └──────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 支付(策略)+ 状态(状态机) │ └──────────────┬───────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 事件(观察者)+ 享元(标签) │ └──────────────────────────────────────┘

5.2 模式的核心价值

模式价值在下单全链路
外观统一对外Controller
责任链多步可中断风控
模板方法流程固定下单骨架
策略算法可切换支付
状态行为随状态状态机
观察者一对多通知事件
享元共享对象标签
单例节省内存Bean

六、本篇小结 + 下篇预告

6.1 本篇小结

  1. 下单全链路 = 7 大模式协作
  2. 每个模式有明确分工
  3. 模式之间可叠加使用

6.2 实战心法

  • 外观 + 责任链:先做风控
  • 模板方法 + 工厂:固定流程
  • 策略 + 状态:业务核心
  • 观察者 + 享元:性能与解耦

6.3 下篇预告

第 49 篇【综合实战 - 中篇】:大白商城营销全链路设计模式应用

下一篇我们看营销全链路——优惠计算链 / 优惠券模板 / 营销规则引擎,用到了另外 5 大模式:

  1. 策略 + 责任链 + 访问者 + 享元 + 解释器
  2. 营销规则的动态化
  3. 优惠叠加计算

并附完整的代码 + 流程图 + 模式协作图。


觉得对您有帮助,麻烦点点关注啦,您的关注是我创作的最大动力~ 🎯

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询