ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

大白话说Java设计模式-48-综合实战上:下单全链路设计模式应用 大厂规范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️⃣ 抽象方法OrderordercreateOrder(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{privatefinalConcurrentHashMapString,TagtagPoolnewConcurrentHashMap();publicTaggetTag(Stringname){returntagPool.computeIfAbsent(name,this::createTag);}}作用100 万件商品的 500 万个标签从 5GB 降到 50MB。四、完整代码实战4.1 Controller外观/** * ✅ 外观统一对外接口 */RestControllerRequestMapping(/api/order)publicclassOrderController{AutowiredprivateOrderServiceorderService;AutowiredprivateRiskControlServiceriskService;PostMapping(/create)publicOrderResultcreateOrder(RequestBodyOrderRequestrequest){// 1️⃣ 风控链RiskResultriskResultriskService.check(buildRiskContext(request));if(!riskResult.isApproved()){returnOrderResult.failed(riskResult.getReason());}// 2️⃣ 下单模板方法returnorderService.createOrder(request);}}4.2 Service模板方法/** * ✅ Service模板方法调用方 */ServicepublicclassOrderService{AutowiredprivateListAbstractOrderProcessorprocessors;publicOrderResultcreateOrder(OrderRequestrequest){// 1️⃣ 选模板按订单类型AbstractOrderProcessorprocessorselectProcessor(request);// 2️⃣ 调模板方法returnprocessor.processOrder(buildContext(request));}}4.3 风控链责任链/** * ✅ 风控责任链 */ServicepublicclassRiskControlService{AutowiredprivateBlackListHandlerblackListHandler;AutowiredprivateFrequencyHandlerfrequencyHandler;publicRiskResultcheck(RiskContextcontext){ListRiskHandlerhandlersList.of(blackListHandler,frequencyHandler);RiskChainchainnewRiskChain(handlers);returnchain.process(context);}}4.4 支付策略/** * ✅ 支付策略 */ServicepublicclassPaymentContext{privatefinalMapString,PaymentStrategystrategyMapnewHashMap();AutowiredpublicPaymentContext(ListPaymentStrategystrategies){strategies.forEach(s-strategyMap.put(s.getChannel(),s));}publicPaymentResultpay(Stringchannel,PaymentRequestrequest){returnstrategyMap.get(channel).pay(request);}}4.5 状态机状态/** * ✅ 状态订单状态机 */ComponentpublicclassOrderStateMachine{AutowiredprivateApplicationEventPublishereventPublisher;publicvoidchangeState(Orderorder,OrderEventevent){// 1️⃣ 改状态OrderStateoldStateorder.getState();event.applyTo(order);OrderStatenewStateorder.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 本篇小结下单全链路 7 大模式协作每个模式有明确分工模式之间可叠加使用6.2 实战心法外观 责任链先做风控模板方法 工厂固定流程策略 状态业务核心观察者 享元性能与解耦6.3 下篇预告第 49 篇【综合实战 - 中篇】大白商城营销全链路设计模式应用下一篇我们看营销全链路——优惠计算链 / 优惠券模板 / 营销规则引擎用到了另外 5 大模式策略 责任链 访问者 享元 解释器营销规则的动态化优惠叠加计算并附完整的代码 流程图 模式协作图。觉得对您有帮助麻烦点点关注啦您的关注是我创作的最大动力~
返回列表