Java 中的复合实体模式:简化持久化对象管理
大约 3 分钟
也称为
- 粗粒度实体
复合实体设计模式的意图
Java 中的复合实体设计模式旨在将一组相互关联的持久化对象管理起来,就像它们是一个单一实体一样。它通常用于企业应用程序,特别是在 Enterprise JavaBeans (EJB) 和类似的企业框架中,用于在业务模型中表示基于图的数据结构。这种模式使客户能够将这些复杂结构视为一个整体,简化操作和交互。
复合实体模式的详细解释及其现实世界示例
现实世界示例
考虑一个大学注册系统,其中“学生”实体是一个复合实体。每个“学生”对象都包含几个依赖对象:个人详细信息、课程注册、成绩和付款信息。复合实体设计模式允许大学系统将“学生”视为一个单一实体,而不是分别管理这些方面中的每一个。这简化了诸如将学生注册到新课程、更新成绩和处理付款等操作,因为所有相关操作都可以通过复合“学生”对象来管理。
通俗地说
Java 中的复合实体模式允许一组相关的持久化对象被一个统一的对象表示和管理,从而简化企业应用程序的设计。
维基百科说
复合实体是 Java EE 软件设计模式,它用于对一组相互关联的持久化对象进行建模、表示和管理,而不是将它们表示为单独的细粒度实体 Bean,复合实体 Bean 也表示对象的图。
Java 中复合实体的编程示例
对于一个控制台,可能存在许多需要管理和控制的接口。使用复合实体模式,消息和信号等依赖对象可以组合起来,并使用单个对象进行控制。
我们需要一个通用的解决方案来解决这个问题。为了实现这一点,让我们引入一个通用的复合实体模式。
public abstract class DependentObject<T> {
T data;
public void setData(T message) {
this.data = message;
}
public T getData() {
return data;
}
}
public abstract class CoarseGrainedObject<T> {
DependentObject<T>[] dependentObjects;
public void setData(T... data) {
IntStream.range(0, data.length).forEach(i -> dependentObjects[i].setData(data[i]));
}
public T[] getData() {
return (T[]) Arrays.stream(dependentObjects).map(DependentObject::getData).toArray();
}
}
专门的复合实体console
继承自此基类,如下所示。
public class MessageDependentObject extends DependentObject<String> {
}
public class SignalDependentObject extends DependentObject<String> {
}
public class ConsoleCoarseGrainedObject extends CoarseGrainedObject<String> {
@Override
public String[] getData() {
super.getData();
return new String[] {
dependentObjects[0].getData(), dependentObjects[1].getData()
};
}
public void init() {
dependentObjects = new DependentObject[] {
new MessageDependentObject(), new SignalDependentObject()};
}
}
public class CompositeEntity {
private final ConsoleCoarseGrainedObject console = new ConsoleCoarseGrainedObject();
public void setData(String message, String signal) {
console.setData(message, signal);
}
public String[] getData() {
return console.getData();
}
}
现在使用复合实体console
管理消息和信号对象的分配。
public App(String message, String signal) {
var console = new CompositeEntity();
console.init();
console.setData(message, signal);
Arrays.stream(console.getData()).forEach(LOGGER::info);
console.setData("Danger", "Red Light");
Arrays.stream(console.getData()).forEach(LOGGER::info);
}
何时在 Java 中使用复合实体模式
- 在 Java 企业应用程序中非常有用,在这些应用程序中,业务对象很复杂,涉及各种相互依赖的持久化对象。
- 对于客户端需要使用统一的接口来访问一组对象而不是单个实体的情况非常理想。
- 适用于需要为外部客户端或服务简化复杂数据模型视图的系统。
Java 中复合实体模式的现实世界应用
- 具有复杂业务模型的企业应用程序,特别是那些使用 EJB 或类似企业框架的应用程序。
- 需要对复杂数据库模式进行抽象以简化客户端交互的系统。
- 需要在业务实体中的多个持久化对象之间强制一致性或事务的应用程序。
复合实体模式的优缺点
优点
- 通过提供统一的接口,简化了客户端与复杂实体模型的交互。
- 通过将客户端代码与业务实体内部的复杂细节分离,增强了业务层的可重用性和可维护性。
- 简化了一组相关持久化对象的事务管理和一致性强制。
权衡
- 可能会引入一层间接性,从而影响性能。
- 可能会导致过于粗粒度的接口,这些接口可能无法满足所有客户端需求。
- 需要仔细设计,以避免出现难以管理的臃肿复合实体。
相关的 Java 设计模式
- 装饰器:用于动态地为复合实体中的各个对象添加行为,而不会影响结构。
- 外观:为一个复杂子系统提供了一个简化的接口,类似于复合实体如何简化对一组对象的访问。
- 享元:用于管理复合实体中的共享对象,以减少内存占用。