设计模式-组合实体模式

时间:2022-07-25
本文章向大家介绍设计模式-组合实体模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

背景

通常我们收快递,有时候上班期间真的没有空去收啊,所有就会委托其他人,或者说让房管代收一下,然后房管会统一放到一个地方,下再我们再去取,而这个统一管理,我们就不用直接在工作期间去收快递,并且最终也可以拿到我人们的快递。

组合实体模式是什么?

组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理的。以下是组合实体 bean 的参与者。

角色:

组合实体(Composite Entity) - 它是主要的实体 bean。它可以是粗粒的,或者可以包含一个粗粒度对象,用于持续生命周期。

粗粒度对象(Coarse-Grained Object) - 该对象包含依赖对象。它有自己的生命周期,也能管理依赖对象的生命周期。

依赖对象(Dependent Object) - 依赖对象是一个持续生命周期依赖于粗粒度对象的对象。

策略(Strategies) - 策略表示如何实现组合实体。

优点:

易拓展:组合实体可以自由增加,遵循了开闭原则;

缺点:

破坏了单一职责,又获取组合体信息又打印组合体破坏了单一职责;

组合实体模式可以干嘛?

通过组合实体模式,通过一个组合实体的实客户端来控制原有的实体,进行创建和数据替换,起到一个统一管理。

个人理解:

就类似于收快递,楼下房管给你统一收了,统一放了。

组合实体模式类图

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

实现代码

/**
 * @Auther: Administrator
 * @Date: 2020-06-26 11:31
 * @Description:依赖对象
 */
public class DependentObject2 {
    private String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}
/**
 * @Auther: Administrator
 * @Date: 2020-06-26 11:31
 * @Description:依赖对象
 */
public class DependentObject1 {
    private String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}
/**
 *
 * 功能描述:粗粒度对象
 *
 * @param:
 * @return: 
 * @auther: csh
 * @date: 2020-06-26 11:45
 */
public class CoarseGrainedObject {
   DependentObject1 do1 = new DependentObject1();
   DependentObject2 do2 = new DependentObject2();
 
   public void setData(String data1, String data2){
      do1.setData(data1);
      do2.setData(data2);
   }
 
   public String[] getData(){
      return new String[] {do1.getData(),do2.getData()};
   }
}
/**
 * @Auther: csh
 * @Date: 2020-06-26 11:46
 * @Description:组合体
 */
public class CompositeEntity {
    private CoarseGrainedObject cgo = new CoarseGrainedObject();
    public void setData(String data1,String data2){
        cgo.setData(data1,data2);
    }

    public String[] getData(){
        return  cgo.getData();
    }
}
/**
 * @Auther: csh
 * @Date: 2020-06-26 11:49
 * @Description:测试组合实体对象
 */
public class Client {
    private CompositeEntity compositeEntity = new CompositeEntity();

    public void pintData(){
        for (String s : compositeEntity.getData()) {
            System.out.println("Data:"+s);
        }
    }

    public void setData(String data1,String data2){
        compositeEntity.setData(data1,data2);
    }
}
/**
 * @Auther: csh
 * @Date: 2020-06-26 12:04
 * @Description:组合实体模式
 */
public class Test {

    public static void main(String[] args) {
        Client client = new Client();
        client.setData("Test","Data");
        client.pintData();
        client.setData("test2","data2");
        client.pintData();
    }
}

结果

Data:Test
Data:Data
Data:test2
Data:data2

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

最后

组实合实体跟门面模式,非常相似,同样是一个中心节点,用户的请求都是通过一个对外暴露的实体进行处理,同样存在这个中心节点一但出现问题那系统可能都瘫痪了...就类似于有些小平台,单节点一但哪天并发量上来就直接发挂了...所以在正常场景下,都是通过分布式来布署多节点,并且通过主从互换的,若哪些主节点挂了,子节点马上顶上去。就类似于redis集群哨兵模式一样。