第6篇:实战案例:电子面单编排器——模板方法用继承还是组合?

发布时间:2026/11/2 16:01:32

第6篇:实战案例:电子面单编排器——模板方法用继承还是组合? 第6篇实战案例电子面单编排器——模板方法用继承还是组合摘要多平台电子面单取号流程是模板方法的经典场景但我们在真实架构中放弃了继承选择了组合方式。本文从实战出发对比两种实现方式的优劣展示 WaybillFetchTemplate 如何通过注入策略对象固定流程骨架并给出顺丰子母件分支的处理技巧。​系列导航上一篇框架里的模板方法HttpServlet、JdbcTemplate、AbstractList下一篇六大设计原则在模板方法中的体现原系列总目录 订阅本专栏不错过每一篇本文是《Java 23 种设计模式从踩坑到精通》模板方法模式长文的扩充短文第6篇帮助你碎片化掌握核心知识点。前面我们用饮品制作和数据同步理解了模板方法的经典用法但在真实的电商WMS系统中多平台电子面单取号流程遇到了一个棘手的选择题模板方法到底该用继承还是组合场景回顾多平台取号的共性流程电子面单取号的流程对所有平台来说都是一样的骨架校验订单 → 构建请求 → 调用API → 判断成功 → 解析响应 → 持久化但每一步的具体实现因平台而异奇门淘宝/天猫请求格式为XML签名算法MD5响应解析需遍历节点抖音请求格式为JSON签名算法HMAC-SHA256响应解析需处理加密字段京东请求格式为自定义协议需调用京东SDK如果每个平台都写一套完整的取号流程代码重复不说一旦流程变更所有实现都要改。我们的选择用组合实现模板方法传统模板方法模式用继承实现——父类定义骨架子类覆写抽象方法。但在我们的电子面单架构中选择了组合方式。核心编排器WaybillFetchTemplate是一个普通的类通过构造函数注入三个策略对象publicclassWaybillFetchTemplate{privatefinalRequestStrategyrequestStrategy;privatefinalParseStrategyparseStrategy;privatefinalExceptionStrategyexceptionStrategy;privatefinalApiInvokerapiInvoker;privatefinalWaybillPersistencepersistence;// 通过构造函数注入策略publicWaybillFetchTemplate(RequestStrategyreq,ParseStrategyparse,ExceptionStrategyex,ApiInvokerinvoker,WaybillPersistencepersist){this.requestStrategyreq;this.parseStrategyparse;this.exceptionStrategyex;this.apiInvokerinvoker;this.persistencepersist;}// 模板方法固定取号流程骨架publicbooleanexecute(WaybillContextctx){// 1. 构建请求策略ObjectrequestrequestStrategy.buildRequest(ctx);// 2. 调用API统一StringresponseapiInvoker.invoke(ctx,request);// 3. 业务异常判断策略if(!exceptionStrategy.isBusinessSuccess(response)){markException(ctx.getTicket(),exceptionStrategy.extractErrorMsg(response));returnfalse;}// 4. 解析响应策略ListDetaildetailsparseStrategy.parseResponse(ctx,response);if(details.isEmpty()){markException(ctx.getTicket(),未获取到运单号);returnfalse;}// 5. 持久化统一persistence.saveAndBind(ctx.getTicket(),details,ctx.isFirst());returntrue;}}使用方式——运行时注入不同平台的策略// 奇门取号RequestStrategyreqnewQiMenRequestStrategy();ParseStrategyparsenewQiMenParseStrategy();ExceptionStrategyexnewQiMenExceptionStrategy();WaybillFetchTemplatetemplatenewWaybillFetchTemplate(req,parse,ex,invoker,persistence);template.execute(ctx);// 抖音取号reqnewDouYinRequestStrategy();parsenewDouYinParseStrategy();exnewDouYinExceptionStrategy();templatenewWaybillFetchTemplate(req,parse,ex,invoker,persistence);template.execute(ctx);为什么用组合而不是继承维度继承方式组合方式类数量​N 个平台 → N 个子类1 个模板类 3 个策略接口灵活性​编译期绑定运行时动态替换策略测试性​需创建子类实例直接 Mock 策略注入复用性​子类间无法复用策略策略可跨平台组合关键原因平台差异已经被三个策略接口完美隔离。如果再用一个抽象的AbstractWaybillFetchTemplate让各平台子类去实现等于把同样的差异逻辑在两个地方重复定义——子类既要实现策略接口又要覆写模板的抽象方法这是典型的“过度抽象”。模板层的额外优势顺丰子母件分支组合方式还有一个额外优势——在模板层增加流程分支非常自然。顺丰超过 10 件需要走子母件模式分批调用 API我们直接在模板类中增加一个分支方法publicbooleanexecute(WaybillContextctx){if(isSFMoreTen(ctx)){returnexecuteSFMoreTen(ctx);// 子母件分支多次调用}returnexecuteNormal(ctx);// 普通分支单次调用}如果用继承子母件逻辑要么重复在每个子类中实现要么在父类中增加复杂的分支判断很容易失控。组合方式让模板层成为唯一的流程控制点分支逻辑清晰可维护。一句话总结模板方法的核心是“固定流程骨架差异化具体步骤”。骨架既可以用继承实现也可以用组合实现。当差异点已被策略接口隔离时组合方式更灵活、更简洁。完整长文入口本文是模板方法模式扩充系列的第6篇。如果你想一次性阅读完整内容含UML、完整代码、框架应用、面试追问等请查看原长文 《Java 23 种设计模式从踩坑到精通 | 模板方法模式》系列导航上一篇框架里的模板方法HttpServlet、JdbcTemplate、AbstractList下一篇六大设计原则在模板方法中的体现返回扩充系列目录 订阅本专栏不错过每一篇原系列总目录 订阅本专栏不错过每一篇实战配套本文的电子面单编排器设计在《电商多平台电子面单对接实战》系列中有完整落地代码多平台统一架构设计模板方法的组合与继承抉择
延伸阅读

更多相关文章

2026/11/2 16:01:05

第8篇:模板方法模式的优缺点与面试高频考点

第8篇:模板方法模式的优缺点与面试高频考点 摘要:模板方法模式有哪些优缺点?面试官最喜欢追问哪些问题?本文用一张优缺点表和四道高频面试题,帮你快速复习并巩固模板方法模式的核心要点,从容应对面试。​ &…

2026/10/31 19:41:16

华为OD机试真题 新系统 2026-07-01 C++ 实现【奇偶三数之和】

目录 题目 思路 Code 题目 给定一个包含 n 个整数的数组 nums 和一个整数 target,请从数组中找出所有不重复的三元组 [nums[i], nums[j], nums[k]],满足以下两个条件: 第1点:三数之和等于目标值:nums[i] + nums[j] + nums[k] = target。 第2点:三个元素中至少有两个是…

2026/10/30 22:40:12

【计算机工具类-协作工具Skills】cal-com-automation 技能

通过Rube MCP (Composio)自动化Cal.com任务:管理预订、检查可用性、配置webhooks和处理团队。始终先搜索工具以获取当前架构。 技能概述 cal-com-automation 技能通过Composio的Cal工具包和Rube MCP自动化Cal.com日程安排操作。此技能允许AI代理管理预订、检查可用…

2026/11/2 15:57:41

《监狱模拟器》闪退卡顿启动报错全解析:从运行库到硬件的排查手册

游戏启动就闪退、点开图标转两圈直接回桌面、进到主菜单之前卡成幻灯片——这类问题在模拟经营类游戏里特别常见,《监狱模拟器》这种带大量AI角色、动态场景加载和复杂状态机的作品更是重灾区。我自己前前后后在这款游戏上折腾过三台不同配置的机器,从老…

2026/11/2 15:57:41

RAG数据集构建指南:148个实战资源与12项质量检测标准

1. RAG数据集全景解析:为什么开发者需要这份避坑指南? 在大模型应用开发领域,检索增强生成(RAG)技术已经成为连接私有数据与预训练大模型的关键桥梁。但许多团队在实施过程中常陷入"数据陷阱"——精心设计的…

2026/11/2 15:57:41

电动汽车V2G智能控制平台设计与优化实践

1. 电动汽车储能与用能协同优化平台概述电动汽车作为新型电力负荷和分布式储能单元的双重身份,正在重塑能源系统的运行模式。这个项目聚焦于开发一个智能控制平台,旨在协调优化电动汽车在交通运输和电网服务中的双重功能。简单来说,就是让电动…

2026/11/2 15:57:41

Simplex开源工具库深度解析:设计思路、核心模块与实操避坑指南

做开源项目最怕的一件事,就是拿到一个名字听起来很唬人的仓库,点进去发现文档只有三行,示例跑不起来,issue 区一片沉默。我这些年陆陆续续接触过不少以“Simplex”命名的开源项目——这个词本身在数学、通信、优化算法里都有特定含…

2026/11/2 15:57:41

4B小模型如何通过DASD技术逆袭32B大模型

1. 项目概述:当4B小模型逆袭32B巨无霸上周在GitHub Trending上看到一个震撼标题:清华代码熊团队用4B参数的蒸馏模型,在部分基准测试中超越了阿里Qwen3-32B的表现。这就像看到一辆微型电动车在直线加速赛上赢过了12缸超跑,立刻引起…

2026/11/2 15:52:36

AI前沿技术日更简报:高效筛选与验证机制解析

1. 项目概述:AI前沿技术日更简报的价值定位 每天清晨打开邮箱就能获取一份精心筛选的AI技术动态,这可能是2026年最有效率的行业信息获取方式。我们这个"AI前沿技术日更简报"项目,本质上是一个面向技术决策者、研发工程师和科技投资…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业级SPI隔离设计:硬件抗扰与信号完整性实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

PLFM_RADAR:主动探测数据通道,构建低误报的数据感知系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 1:04:04

工业SPI隔离设计:MAX14431与STM32F746硬件抗干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑