自学教程 学编程从这里开始

组合实体模式

《组合实体模式》|J2EE企业架构模式

关键词:Composite Entity、组合实体、粗粒度对象、聚合细粒度对象、J2EE模式
说明:组合实体模式不属于GOF23设计模式,属于J2EE企业架构模式

一、什么是组合实体模式

组合实体模式(Composite Entity Pattern):用于EJB持久化场景,把一组相互关联的细粒度实体对象,封装成一个粗粒度的组合实体对象。客户端只和这个粗粒度组合实体交互,不需要操作内部零散子对象。
当组合实体更新时,内部所有依赖的细粒度对象同步更新;内部子对象的生命周期由组合实体统一管理。

核心意图
将一组关联的细粒度业务对象聚合,对外提供统一粗粒度实体,简化客户端使用;统一管理内部子对象的生命周期与数据同步。

角色划分

  1. Composite Entity(组合实体):粗粒度主对象,持有多个细粒度对象,对外提供统一业务接口
  2. Coarse-Grained Object(粗粒度对象):组合实体的核心,包含对细粒度对象的引用,实现主要业务逻辑
  3. Dependent Object(依赖/细粒度对象):被粗粒度对象包含,属于组合实体内部子对象,生命周期受组合实体管控
  4. Client(客户端):直接操作组合实体,完全不感知内部细粒度对象

数据流:
Client → Composite Entity → Dependent Object

二、UML结构图

角色划分:

  1. Client:客户端,调用组合实体
  2. CompositeEntity:组合实体,内部维护粗粒度对象
  3. CoarseGrainedObject:粗粒度对象,持有多个依赖对象
  4. 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结构型模式树状结构,统一对待单个对象和对象集合,递归遍历树形节点

五、优缺点总结

✅ 优点

  1. 客户端只操作单一组合实体,屏蔽内部多个细粒度对象,简化调用
  2. 统一管理一组关联对象,数据变更可以一次性同步
  3. 内部细粒度对象修改,对客户端透明

❌ 缺点

  1. 耦合度高,内部依赖对象变更会影响组合实体
  2. 源自老旧EJB规范,现代Spring开发几乎不再使用
  3. 组合实体容易过于庞大,职责过重

六、框架应用场景

  • 经典J2EE EJB 2.0 实体Bean场景

现代开发:领域模型、聚合根(DDD Aggregate)思想和它很相似;DDD聚合根是它现代化替代方案。

七、小结

组合实体模式核心:将一组关联细粒度对象封装到粗粒度组合实体,客户端只操作组合实体,内部子对象对外隐藏。

归属:J2EE架构模式,不属于GOF23;起源于EJB,现在项目很少直接手写,DDD聚合根思想继承了它的设计思路。

标签:

0 条笔记