Java 中的收集参数模式:掌握高效的参数处理
别名
- 收集器
- 累加器
收集参数设计模式的意图
Java 设计模式中的收集参数模式旨在通过将多个参数聚合到单个集合对象中来简化方法调用。此模式对于通过各种方法调用传递单个集合对象来收集信息的方法特别有效。然后,每个方法可以将结果添加到此集合中,而不是创建自己的集合。这种方法增强了代码可读性和可维护性,优化了 Java 编程中信息收集的过程。
收集参数模式的详细解释以及现实世界示例
现实世界示例
在软件开发中,收集参数模式通过优化方法调用和提高代码可维护性提供了显著优势。
想象一下,在一家餐厅,服务员需要从顾客那里接收订单。服务员不是分别记录每个项目(例如,开胃菜、主菜、甜点、饮料),而是使用一个订单表,将所有项目收集到一个单一文档中。此订单表通过将所有详细信息聚合到一个地方,简化了服务员与厨房工作人员之间的沟通。类似地,在软件中,收集参数模式将多个参数聚合到单个对象中,从而简化方法调用,并提高代码可读性和可维护性。
通俗地讲
收集参数模式通过将多个参数封装到单个对象中来简化方法调用。
维基百科说
在收集参数习惯用法中,一个集合(列表、映射等)被反复地作为参数传递给一个方法,该方法向集合中添加项目。
Java 中收集参数模式的编程示例
在一栋大型企业大厦中,存在一个全局打印队列,它是当前所有待打印作业的集合。不同的楼层包含不同型号的打印机,每种打印机都有不同的打印策略。我们必须构建一个程序,可以持续地将合适的打印作业添加到一个称为收集参数的集合中。
以下业务规则已实施
- 如果 A4 纸是彩色的,它也必须是单面的。所有其他非彩色纸张都被接受
- A3 纸必须是无色的,单面的
- A2 纸必须是单页、单面、无色的
让我们先看看实现,然后解释。
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 LinkedList<PrinterItem>();
addValidA4Papers(result);
addValidA3Papers(result);
addValidA2Papers(result);
}
public static void addValidA4Papers(Queue<PrinterItem> 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(Queue<PrinterItem> printerItemsCollection) {
for (PrinterItem nextItem : printerQueue.getPrinterQueue()) {
if (nextItem.paperSize.equals(PaperSizes.A3)) {
var isNotColouredAndSingleSided = !nextItem.isColour && !nextItem.isDoubleSided;
if (isNotColouredAndSingleSided) {
printerItemsCollection.add(nextItem);
}
}
}
}
public static void addValidA2Papers(Queue<PrinterItem> printerItemsCollection) {
for (PrinterItem nextItem : printerQueue.getPrinterQueue()) {
if (nextItem.paperSize.equals(PaperSizes.A2)) {
var isNotColouredSingleSidedAndOnePage = nextItem.pageCount == 1 && !nextItem.isDoubleSided
&& !nextItem.isColour;
if (isNotColouredSingleSidedAndOnePage) {
printerItemsCollection.add(nextItem);
}
}
}
}
}
此 App
类是应用程序的主要入口点。它使用收集参数设计模式来根据某些策略过滤打印作业。
初始化:
printerQueue
使用三个不同纸张尺寸(A4、A3、A2)的打印作业进行初始化。创建收集参数:创建一个名为
result
的LinkedList
来存储符合策略要求的打印作业。将有效作业添加到收集参数:调用
addValidA4Papers
、addValidA3Papers
和addValidA2Papers
方法。这些方法遍历printerQueue
并将符合策略要求的打印作业添加到result
列表中。
result
列表(即收集参数)在从方法传递到方法时累积有效打印作业。这是收集参数设计模式的本质。
在 Java 设计模式中使用收集参数模式会导致更有效的方法调用和改进的整体代码结构。
何时在 Java 中使用收集参数模式
此模式对于管理 Java 编码实践中的参数很有用,可以确保高效的代码重构和增强的可读性。
- 当方法需要接受大量参数时使用,这使得方法签名变得笨拙。
- 当同一组参数传递给多个方法时使用,可以减少冗余和潜在错误。
- 用于提高代码的可读性和可维护性。
收集参数模式 Java 教程
Java 中收集参数模式的现实世界应用
- 当方法需要接受大量参数时使用,这使得方法签名变得笨拙。
- 当同一组参数传递给多个方法时使用,可以减少冗余和潜在错误。
- 用于提高代码的可读性和可维护性。
收集参数模式的优点和权衡
优点
- 通过减少方法签名中的参数数量来提高代码可读性。
- 促进参数集在不同方法中的重复使用。
- 通过集中参数结构来增强可维护性。
权衡
- 引入一个额外的类,如果管理不当,可能会增加复杂性。
- 如果参数对象变得太大或笨拙,可能会导致过度泛化。
相关的 Java 设计模式
- 命令:命令可以使用收集参数来聚合由命令对象执行的多个操作的结果。
- 组合:当处理分层结构时,可以与收集参数一起使用,允许跨组合结构收集结果。
- 访问者:经常一起使用,其中访问者处理结构的遍历和操作,而收集参数累积结果。