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

发布时间:2026/7/12 23:35:24

第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下一篇六大设计原则在模板方法中的体现返回扩充系列目录 订阅本专栏不错过每一篇原系列总目录 订阅本专栏不错过每一篇实战配套本文的电子面单编排器设计在《电商多平台电子面单对接实战》系列中有完整落地代码多平台统一架构设计模板方法的组合与继承抉择

相关新闻

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

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

2026/7/12 23:35:24

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

Gemma-4-12B-it-qat-OptiQ-4bit多模态应用实战:图像+文本生成完全教程

Gemma-4-12B-it-qat-OptiQ-4bit多模态应用实战:图像+文本生成完全教程

2026/7/12 23:25:23

Gemma-4-12B-it-qat-OptiQ-4bit多模态应用实战:图像文本生成完全教程 【免费下载链接】gemma-4-12B-it-qat-OptiQ-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/gemma-4-12B-it-qat-OptiQ-4bit Gemma-4-12B-it-qat-OptiQ-4bit是一款基于…

终极指南:如何用PyRIT轻松识别AI安全风险,保护你的生成式AI系统

终极指南:如何用PyRIT轻松识别AI安全风险,保护你的生成式AI系统

2026/7/12 23:25:23

终极指南:如何用PyRIT轻松识别AI安全风险,保护你的生成式AI系统 【免费下载链接】PyRIT The Python Risk Identification Tool for generative AI (PyRIT) is an open source framework built to empower security professionals and engineers to proac…

[具身智能-585]:RDK X5 板载蓝牙 5.4 完整用途(基于 Ubuntu 22.04 + BlueZ 协议栈)

[具身智能-585]:RDK X5 板载蓝牙 5.4 完整用途(基于 Ubuntu 22.04 + BlueZ 协议栈)

2026/7/13 1:25:28

RDK X5 集成蓝牙 5.4 双模(经典蓝牙 BR/EDR BLE 低功耗蓝牙),适配机器人、边缘 AI、工业物联网、智能视觉四大场景,分 6 大类核心用途:一、机器人无线遥控(最主流场景)适配 ROS/TogetheROS.Bot…

【PostgreSQL-16】搭建主从复制实现读写分离与故障转移

【PostgreSQL-16】搭建主从复制实现读写分离与故障转移

2026/7/13 1:25:28

Rocky Linux 9.7通过Patroni etcd HAProxy pgBouncer搭建PostgreSQL 16主从复制架构,实现一主一从、读写分离与自动故障切换。1、PGSQL主从复制原理 PostgreSQL 主从采用基于 WAL 预写日志的物理流式复制: 主库客户端执行 DML,数据变更先写…

N皇后问题的遗传算法Python实战:从编码到收敛细节

N皇后问题的遗传算法Python实战:从编码到收敛细节

2026/7/13 1:25:28

1. 这不是教科书里的遗传算法,而是我亲手调通100皇后问题后写下的实操笔记你点开这篇文章,大概率不是为了背诵“遗传算法是模拟生物进化过程的优化方法”这种定义。你可能刚在课上听了一耳朵“选择、交叉、变异”,结果写代码时卡在“怎么把棋…

HDFS 深度解析:大数据存储的“硬盘不够、单盘坏了怎么办“

HDFS 深度解析:大数据存储的“硬盘不够、单盘坏了怎么办“

2026/7/13 1:25:28

HDFS 深度解析:大数据存储的"硬盘不够、单盘坏了怎么办" 做大数据的人,绕不开 HDFS。 你的数据量上了 PB 级,单机硬盘装不下;硬盘总会坏,数据丢了怎么办?HDFS 就是 Google GFS 的开源实现&#x…

学生党的福音?聊聊我用阿贝云免费云服务器搭建博客的体验

学生党的福音?聊聊我用阿贝云免费云服务器搭建博客的体验

2026/7/13 1:25:28

学生党的福音?聊聊我用阿贝云免费云服务器搭建博客的体验 对于像我这样预算有限但又想捣鼓点东西的学生党来说,想找一台配置尚可的云服务器来练手,真不是件容易的事。市面上很多所谓的“免费”试用要么只有短短几天,要么就是需…

Translumo:你的游戏与视频实时翻译神器,打破语言障碍的终极方案

Translumo:你的游戏与视频实时翻译神器,打破语言障碍的终极方案

2026/7/13 1:15:27

Translumo:你的游戏与视频实时翻译神器,打破语言障碍的终极方案 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Tr…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/12 0:03:42

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

卡梅德生物技术快报|纯化重组蛋白:变异链球菌 SepM 截短蛋白载体构建、诱导优化与纯化重组蛋白全套参数方案

2026/7/13 0:05:25

1 研究背景与现存技术痛点(提出问题)在口腔微生物分子机制研究中,SepM 蛋白酶是调控变异链球菌群体感应、致龋菌素合成的核心功能蛋白,体外功能验证、抗体开发均依赖高纯度可溶性 SepM 蛋白。当前原核表达体系针对 SepM 存在三大技…

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

2026/7/13 0:05:25

1 研究背景与现存技术痛点(提出问题)基因工程、蛋白质组学、生物制药研发流程中,蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈:传统离子交换、分子筛层析无特异性…

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

卡梅德生物技术快报|蛋白质分离纯化:肠激酶可溶性原核表达 + 两步层析全参数|标准化蛋白质分离纯化 SOP

2026/7/13 0:05:25

研究痛点提出(提出问题)重组肠激酶是融合标签切除核心工具酶,当前原核表达体系存在三大标准化难题,直接阻碍可复现的蛋白质分离纯化流程搭建:Trx、GST、单 SUMO 标签融合产物绝大多数为包涵体,沉淀占比超 9…