《组合实体模式》|J2EE企业架构模式
关键词:Composite Entity、组合实体、粗粒度对象、聚合细粒度对象、J2EE模式
说明:组合实体模式不属于GOF23设计模式,属于J2EE企业架构模式
一、什么是组合实体模式
组合实体模式(Composite Entity Pattern):用于EJB持久化场景,把一组相互关联的细粒度实体对象,封装成一个粗粒度的组合实体对象。客户端只和这个粗粒度组合实体交互,不需要操作内部零散子对象。
当组合实体更新时,内部所有依赖的细粒度对象同步更新;内部子对象的生命周期由组合实体统一管理。

核心意图
将一组关联的细粒度业务对象聚合,对外提供统一粗粒度实体,简化客户端使用;统一管理内部子对象的生命周期与数据同步。
角色划分
- Composite Entity(组合实体):粗粒度主对象,持有多个细粒度对象,对外提供统一业务接口
- Coarse-Grained Object(粗粒度对象):组合实体的核心,包含对细粒度对象的引用,实现主要业务逻辑
- Dependent Object(依赖/细粒度对象):被粗粒度对象包含,属于组合实体内部子对象,生命周期受组合实体管控
- Client(客户端):直接操作组合实体,完全不感知内部细粒度对象
数据流:
Client → Composite Entity → Dependent Object
二、UML结构图
角色划分:
- Client:客户端,调用组合实体
- CompositeEntity:组合实体,内部维护粗粒度对象
- CoarseGrainedObject:粗粒度对象,持有多个依赖对象
- DependentObject:细粒度依赖对象,存储子数据

三、Java完整示例
场景:用户信息组合实体,包含用户基础信息、用户地址两个细粒度对象。代码全部使用英文。
// Dependent Object 细粒度依赖对象
public class DependentObject1 {
private String userName;
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
}
public class DependentObject2 {
private String address;
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}
// Coarse Grained Object 粗粒度对象
public class CoarseGrainedObject {
DependentObject1 do1 = new DependentObject1();
DependentObject2 do2 = new DependentObject2();
public void setData(String name, String address) {
do1.setUserName(name);
do2.setAddress(address);
}
public String[] getData() {
return new String[]{do1.getUserName(), do2.getAddress()};
}
}
// Composite Entity 组合实体
public class CompositeEntity {
private CoarseGrainedObject cgo = new CoarseGrainedObject();
public void setData(String name, String address) {
cgo.setData(name, address);
}
public String[] getData() {
return cgo.getData();
}
}
// Client
public class Client {
public static void main(String[] args) {
CompositeEntity compositeEntity = new CompositeEntity();
compositeEntity.setData("ZhangSan", "HangZhou");
String[] data = compositeEntity.getData();
System.out.println("Name: " + data[0]);
System.out.println("Address: " + data[1]);
compositeEntity.setData("LiSi", "ShangHai");
data = compositeEntity.getData();
System.out.println("Name: " + data[0]);
System.out.println("Address: " + data[1]);
}
}
运行输出:
Name: ZhangSan
Address: HangZhou
Name: LiSi
Address: ShangHai
四、组合实体模式 vs 组合模式(GOF)
| 模式 | 分类 | 核心区别 |
|---|---|---|
| 组合实体模式(Composite Entity) | J2EE架构模式 | 用于EJB持久层,聚合多个关联业务实体,统一对外访问 |
| 组合模式(Composite) | GOF结构型模式 | 树状结构,统一对待单个对象和对象集合,递归遍历树形节点 |
五、优缺点总结
✅ 优点
- 客户端只操作单一组合实体,屏蔽内部多个细粒度对象,简化调用
- 统一管理一组关联对象,数据变更可以一次性同步
- 内部细粒度对象修改,对客户端透明
❌ 缺点
- 耦合度高,内部依赖对象变更会影响组合实体
- 源自老旧EJB规范,现代Spring开发几乎不再使用
- 组合实体容易过于庞大,职责过重
六、框架应用场景
- 经典J2EE EJB 2.0 实体Bean场景
现代开发:领域模型、聚合根(DDD Aggregate)思想和它很相似;DDD聚合根是它现代化替代方案。
七、小结
组合实体模式核心:将一组关联细粒度对象封装到粗粒度组合实体,客户端只操作组合实体,内部子对象对外隐藏。
归属:J2EE架构模式,不属于GOF23;起源于EJB,现在项目很少直接手写,DDD聚合根思想继承了它的设计思路。
0 条笔记