Java 中的参数对象模式:使用结构化数据简化方法签名
别称
- 参数对象
参数对象设计模式的意图
参数对象模式是一种关键的 Java 设计模式,旨在通过将参数封装到单个对象中来减少方法的复杂性,从而提高代码的可维护性。
参数对象模式的详细解释及现实世界例子
现实世界例子
想象一下预订一个包含机票、酒店和租车的旅游套餐。与其每次都让客户分别提供每个组件的详细信息(机票详细信息、酒店详细信息和租车详细信息),旅行社会要求客户填写一份包含所有必要信息的综合表格。
- 航班详细信息:出发城市、到达城市、出发日期、返回日期。
- 酒店详细信息:酒店名称、入住日期、退房日期、房型。
- 租车详细信息:取车地点、还车地点、租车日期、车型。
在这个类比中,综合表格就是参数对象。它将所有相关详细信息(参数)分组到一个单一实体中,使预订流程更简化、更易于管理。旅行社(方法)只需要处理一个表格(参数对象),而不是处理多个信息片段。
通俗地说
参数对象模式将多个相关参数封装到一个单一对象中,以简化方法签名并提高代码的可维护性。
用参数对象替换 LongParameterList;一个带有数据成员的对象或结构,这些数据成员代表要传入的参数。
Java 中参数对象模式的编程示例
参数对象设计模式是一种将多个参数分组到单个对象中的方法。这简化了方法签名并提高了代码的可维护性,使 Java 开发人员能够简化复杂的方法调用,专注于更简洁、更易于维护的 Java 代码。
首先,让我们看一下 ParameterObject
类。此类封装了搜索操作所需的参数。它使用 Builder 模式 允许轻松创建对象,即使存在许多参数。
public class ParameterObject {
private final String type;
private final String sortBy;
private final SortOrder sortOrder;
private ParameterObject(Builder builder) {
this.type = builder.type;
this.sortBy = builder.sortBy;
this.sortOrder = builder.sortOrder;
}
public static Builder newBuilder() {
return new Builder();
}
// getters and Builder class omitted for brevity
}
ParameterObject
内部的 Builder
类提供了一种构建 ParameterObject
实例的方法。它具有用于设置每个参数的方法,以及一个 build
方法用于创建 ParameterObject
。
public static class Builder {
private String type = "all";
private String sortBy = "price";
private SortOrder sortOrder = SortOrder.ASCENDING;
public Builder withType(String type) {
this.type = type;
return this;
}
public Builder sortBy(String sortBy) {
this.sortBy = sortBy;
return this;
}
public Builder sortOrder(SortOrder sortOrder) {
this.sortOrder = sortOrder;
return this;
}
public ParameterObject build() {
return new ParameterObject(this);
}
}
SearchService
类有一个 search()
方法,它接受一个 ParameterObject
作为参数。此方法使用封装在 ParameterObject
中的参数执行搜索操作。
public class SearchService {
public String search(ParameterObject parameterObject) {
return getQuerySummary(parameterObject.getType(), parameterObject.getSortBy(),
parameterObject.getSortOrder());
}
// getQuerySummary method omitted for brevity
}
最后,在 App
类中,我们使用其 builder 创建一个 ParameterObject
,然后将其传递给 SearchService
的 search()
方法。
public class App {
public static void main(String[] args) {
ParameterObject params = ParameterObject.newBuilder()
.withType("sneakers")
.sortBy("brand")
.build();
LOGGER.info(params.toString());
LOGGER.info(new SearchService().search(params));
}
}
此示例演示了参数对象模式如何简化方法签名并使代码更易于维护。它还展示了该模式如何与 Builder 模式结合使用,使对象创建更加灵活和易于阅读。
何时在 Java 中使用参数对象模式
- 方法需要多个逻辑上属于一起的相关参数。
- 需要减少方法签名的复杂性。
- 参数可能需要随着时间的推移而发展,添加更多属性而不会破坏现有的方法签名。
- 通过方法链传递数据是有益的。
参数对象模式 Java 教程
Java 中参数对象模式的现实世界应用
- Java 库:许多 Java 框架和库使用这种模式。例如,Java 的 java.util.Calendar 类具有各种使用参数对象来表示日期和时间组件的方法。
- 企业应用程序:在大型企业系统中,参数对象用于封装传递给服务或 API 端点的配置数据。
参数对象模式的优缺点
优点
- 封装:将相关参数分组到一个单一对象中,促进封装。
- 可维护性:当需要添加或修改参数时,减少方法签名更改。
- 可读性:简化方法签名,使代码更易于阅读和理解。
- 可重用性:参数对象可以在不同的方法中重复使用,减少冗余。
权衡
- 开销:引入参数对象可能会增加一些开销,尤其是对于那些没有从这种抽象中获得很大好处的简单方法。
- 复杂性:参数对象的初始创建可能会增加复杂性,尤其是对于初学者。
相关模式
- Builder:有助于逐步创建复杂对象,通常与参数对象结合使用来管理这些对象的构建。
- Composite:有时与参数对象一起使用来处理分层参数数据。
- Factory Method:可用于创建参数对象的实例,尤其是在需要不同参数组合的情况下。