示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载Collecting Parameter收集参数是一种行为型设计模式它通过把一个集合对象作为参数反复传递给多个方法让每个方法把各自的结果累积进同一个集合从而取代一个巨型方法内部各自建集合、再手动合并的笨重写法。本文以 java-design-patterns 仓库中collecting-parameter模块的打印机任务分发场景为主线从模式意图、完整可运行代码、策略规则、类结构到测试验证逐层拆解读完即可在自己的 Java 项目中落地这一重构技巧。模式定位与别称Collecting Parameter 在社区中也常被称为Collector收集器或Accumulator累加器。它的核心思想一句话即可概括在 Collecting Parameter 惯用法中一个集合如 List、Map会被反复作为参数传递给多个方法由这些方法向该集合中添加元素语出 英文 README 与 阿拉伯语版文档。它与 Composed Method组合方法模式的关键区别在于Composed Method 是通过多个方法就地修改同一个集合成员变量而 Collecting Parameter 则是把集合显式作为参数传入传出结果随参数在方法间旅行而不断累积。为什么要用从巨型方法到参数传递现实世界中的场景设想一栋大型商业大楼内存在一个全局打印机队列存放着所有待处理的打印任务不同楼层配备不同型号的打印机各自有独立的打印策略。我们需要编写程序把符合当前打印中心策略的任务持续添加到同一个集合——即收集参数中。通俗解释与其写一个巨大的函数在内部用多个变量和分支去收集信息不如拆成许多小函数每个小函数接收同一个集合参数把符合自身规则的新信息加进去。把该集合依次传给每个小函数后最初想要的结果就自然齐了。拆分后代码更干净、更易读由于大函数被分解后续改动只需定位到具体小函数维护成本显著下降。维基百科的定义在 Collecting Parameter 惯用法中一个集合list、map 等被反复作为参数传递给某个向集合添加元素的方法。打印机队列示例策略与完整代码以下三条业务规则构成整个示例的筛选策略若 A4 纸张是彩色的则必须是单面打印其余所有非彩色 A4 纸张一律接受A3 纸张必须非彩色且单面打印A2 纸张必须单页、单面且非彩色。入口类与收集参数的诞生App.java 是程序入口。它先向单例打印机队列注入三个打印任务再创建LinkedList作为收集参数result最后依次调用三个辅助方法public class App { static PrinterQueue printerQueue PrinterQueue.getInstance(); public static void main(String[] args) { printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A4, 5, false, false)); printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A3, 2, false, false)); printerQueue.addPrinterItem(new PrinterItem(PaperSizes.A2, 5, false, false)); // 这就是收集参数贯穿多个方法的唯一集合 var result new LinkedListPrinterItem(); // 多个子方法协作把符合策略的任务填入 result addValidA4Papers(result); addValidA3Papers(result); addValidA2Papers(result); } }main之后没有任何结果处理代码——因为result是引用类型三个方法对它的修改会直接反映在同一个集合上。这正是收集参数模式方法间共享累积结果的本质。三个策略方法同一集合、各自规则public static void addValidA4Papers(QueuePrinterItem printerItemsCollection) { for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { if (nextItem.paperSize.equals(PaperSizes.A4)) { var isColouredAndSingleSided nextItem.isColour !nextItem.isDoubleSided; if (isColouredAndSingleSided || !nextItem.isColour) { printerItemsCollection.add(nextItem); } } } } public static void addValidA3Papers(QueuePrinterItem printerItemsCollection) { for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { if (nextItem.paperSize.equals(PaperSizes.A3)) { // 编码策略A3 不能同时是彩色和双面 var isNotColouredAndSingleSided !nextItem.isColour !nextItem.isDoubleSided; if (isNotColouredAndSingleSided) { printerItemsCollection.add(nextItem); } } } } public static void addValidA2Papers(QueuePrinterItem printerItemsCollection) { for (PrinterItem nextItem : printerQueue.getPrinterQueue()) { if (nextItem.paperSize.equals(PaperSizes.A2)) { // 编码策略A2 必须单页、单面且非彩色 var isNotColouredSingleSidedAndOnePage nextItem.pageCount 1 !nextItem.isDoubleSided !nextItem.isColour; if (isNotColouredSingleSidedAndOnePage) { printerItemsCollection.add(nextItem); } } } }从源码结构看三个方法形态高度一致遍历全局队列 → 按纸张尺寸过滤 → 把策略编码成一个布尔表达式 → 命中则add进收集参数。策略完全内聚在各自方法中客户端打印中心想调整规则只需改动对应方法无需触碰其他方法。运行结果按策略执行后result中保留的任务如下纸张尺寸页数双面彩色A45falsefalseA32falsefalseA2 任务因页数为 5 ≠ 1被addValidA2Papers正确过滤掉与预期完全一致。支撑类源码剖析PrinterItem打印任务模型PrinterItem.java 定义了任务属性paperSize、pageCount、isDoubleSided、isColour并在构造器中做了防御性校验paperSize为空或pageCount 0时直接抛出IllegalArgumentException保证进入队列的任务数据合法为后续策略判断提供可靠前提。PrinterQueue单例全局队列PrinterQueue.java 采用经典懒加载单例getInstance()首次调用时创建唯一实例私有构造器阻止外部实例化对外提供addPrinterItem、getPrinterQueue、emptyQueue等操作。它模拟了大楼内唯一、全局共享的打印任务源。PaperSizes纸张尺寸枚举PaperSizes.java 仅含A2、A3、A4三个常量为策略方法提供了类型安全的尺寸比较依据如nextItem.paperSize.equals(PaperSizes.A4)。类结构总览模块的类图见 collecting-parameter.urm.png源文件为 collecting-parameter.urm.puml从类图可以清晰看到协作关系App持有PrinterQueue单例三个静态策略方法消费QueuePrinterItemPrinterQueue通过-printerItemQueue聚合PrinterItem而PrinterItem依赖PaperSizes枚举。整个数据流单向清晰没有多余耦合。测试验证模式行为被固化仓库测试代码直接印证了模式的行为契约CollectingParameterTest.java 构造了 11 个覆盖各种策略边界彩色单面 A4、双面彩色 A3、单页 A2、双页 A2 等的任务依次调用三个方法后用assertArrayEquals断言最终结果恰为 4 个合法任务。它证明多个小方法 同一个收集参数累积结果完全确定、可重复验证。PrinterQueueTest.java 验证了单例特性两次getInstance()返回同一对象并用assertThrows验证构造器对负页数、空尺寸的非法输入抛IllegalArgumentException。这组测试非常适合作为你落地该模式时的模板先把策略边界枚举成任务集再断言收集参数最终内容。何时使用 Collecting Parameter根据 阿拉伯语版文档 与源码实践适用场景包括多个方法共同产出一组结果希望以统一方式聚合这些结果需要减少各方法自行创建集合的数量以改善内存与性能开销重构职责过多的大型方法收集结果只是其多项职责之一时将其拆分为若干小方法。典型应用与知名案例Joshua Kerivsky 在《Refactoring to Patterns》中给出了经典真实案例用 Collecting Parameter 构建 XML 树的toString()方法。若不用该模式需要一个塞满条件判断与字符串拼接的巨型函数可读性极差拆分后每个小方法向收集参数追加自己负责的那部分文本逻辑一目了然。类似的常见应用还包括在复杂校验流程中收集错误消息或校验失败项遍历复杂数据结构如树、图时沿途收集元素或信息重构复杂报表函数——报表的各部分由不同方法生成统一汇入同一收集参数。收益与代价优点把集合的处理逻辑集中在统一位置减少重复代码结果在哪收集、如何收集一目了然提升清晰度与可维护性减少多个临时集合的创建与管理工作有利于性能。代价调用方与被调方法之间耦合增强——双方必须就用哪个集合达成一致若管理不善方法可能产生副作用——因为方法不再独立地管理自己的结果需要小心保持方法的纯粹性与可预测性。与相关模式的协同Composite组合处理层级结构时可与之搭配让结果沿组合结构逐层收集Visitor访问者常一起使用——Visitor 负责遍历结构并执行操作Collecting Parameter 负责累积结果Command命令命令对象可以用收集参数聚合多个操作执行后的结果。这三个模式在仓库中均有对应模块composite、visitor、command可在阅读本文后对照源码加深理解。参考资料模块英文 README含完整代码与流程图阿拉伯语版文档源码目录测试目录赞分享示例工程教程【免费下载链接】java-design-patternsDesign patterns implemented in Java项目地址https://gitcode.com/GitHub_Trending/ja/java-design-patterns点击查看免费下载相关推荐HumanLayer Skills 中 response-template.md 如何定义 PR body 输出格式新手完整指南HumanLayer Skills 中 response template.md 如何定义 PR body 输出格式新手完整指南 在 HumanLayer S示例工程教程Java 桥接模式Bridge Pattern实战指南在 java-design-patterns 中解耦抽象与实现Java 桥接模式Bridge Pattern实战指南在 java design patterns 中解耦抽象与实现 桥接模式Bridge是 GoF示例工程教程CubeSandbox 模板检查与请求预览cubemastercli tpl info / tpl render 实战指南CubeSandbox 模板检查与请求预览 cubemastercli tpl info / tpl render 实战指南 当手里只有一个 template示例工程教程上一篇终极指南5分钟用Rufus制作完美Windows启动U盘解决系统安装难题下一篇163MusicLyrics一键解决双平台音乐歌词获取难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考