【问题标题】:Aggregation and Composition Implementation in java using Class Diagram使用类图在java中实现聚合和组合
【发布时间】:2014-12-04 17:24:00
【问题描述】:

我正在尝试了解聚合和组合。
假设我有如下内容:

我想用java实现它,下面的实现是否正确?

public class ClassC { private String z; }  

public class ClassB { 
   private String y; 
   private ClassC classC;
   //-----setter and getter for classC
}   


public class ClassA {
   private String x;
   private List<ClassB> classBList;
   public ClassA(final List<ClassB> classBList) {
      this.classBList=classBList
   }
}  

另外,如何确保 ClassB 可以恰好有 1 个 ClassC ?
ClassA 可以有 1 个或多个 ClassB 吗?如箭头所示(如果我正确理解这些符号)。

【问题讨论】:

  • 你好,mihaisimi!我也浏览了链接,但我是否理解正确,上面的示例是从类图中实现它的正确方法吗?
  • 我了解聚合和组合之间的基础知识和区别,但是从上面的类图以及放置在箭头上的数字何时为 0 或 1 的实现有点困惑
  • 啊,我当时就糊涂了:)。好吧,如果你想确保一个参数被实例化,你总是可以将它标记为 final。这将迫使您内联或在构造函数中实例化它,因此它不能再为 0 并且将满足 1->1 。例如,在 classB 中更改为“private final ClassC classC”。

标签: java uml aggregation composition class-diagram


【解决方案1】:

我认为可能令人困惑的是组合和聚合之间的区别,因为两者都是“具有”关系的示例。 但是组合强于聚合,包含对象控制着部分对象的整个生命周期。

你可以像你一样用 final 来写它,但它并没有完全达到目标:

public class ClassA {
   private String x;
   private final List<ClassB> classBList;
   public ClassA(String x, List<ClassB> classBList) {
      this.classBList=classBList;
      this.x = x;
   }
}  

我认为这样可以更清晰地表达:

public class ClassA{
    private String x;
    private final List<ClassB> classBList;
    public ClassA(String x){
       this.x = x;
       classBList = new ArrayList<ClassB>(2);
       classBList.add(new ClassB(..........));
       classBList.add(new ClassB(..........));
   }

}

【讨论】:

    【解决方案2】:

    您可以通过这种方式对其进行建模,以您的类图为例。对于 ClassA,就像 mihaisimi 所做的那样:在 ClassA 的构造函数中实例化一个 ClassB 列表。如果您想准确确定有多少 ClassB 实例应该是给定 ClassA 实例的一部分,只需向构造函数添加一个整数参数,如果它是 0 则抛出异常。然后使用传递的值作为 Add 方法的循环计数器.

    对于 ClassB,向其 ClassC 类型的构造函数添加一个参数。所以,像这样的东西(java有点生疏,所以请随时根据需要更正我的语法):

    public class ClassA
    {
        public final List<ClassB> classBList;
        public ClassA(int y){
            this.myClassBList = x;
            classBList = new ArrayList<ClassB>(y);
            for(int i=0;i<y;i++)
            {
                 classBList.add(new ClassB(new ClassC));
            }
    }
    
    public class ClassB
    {
        public ClassC myClassCInstance; 
        public ClassB(ClassC myClassC)
        {
            myClassCInstance = myClassC;
        }
    }
    

    如您所见,这允许您将任意数量的 ClassB 实例与 ClassA 实例关联,并根据组合的需要将它们的生命周期与 ClassA 联系起来。此外,如您所见,您不能将多个 ClassC 实例添加到 ClassB 的任何实例,并且 ClassB 的生命周期与 ClassB 的生命周期没有严格耦合。

    因此,如何对组合和构造进行建模的基本区别在于:对于组合,在组合对象(带有菱形的那个)构造函数中实例化组合对象,而对于聚合,将聚合对象传递给聚合对象的构造函数作为参数。

    【讨论】:

      【解决方案3】:

      有很多正确的方法可以实现这样的类图。

      但为了选择正确的实现,您应该首先确保您理解 UML 中定义的关联、聚合和组合的概念。

      我在我的网站上写了一篇关于此的文章:UML Composition vs Aggregation vs Association

      简而言之,Composition 是一种对发展有实际限制和影响的 Association,而 Aggregation 纯粹是 Association 性质的功能指示,没有技术影响。

      【讨论】:

        猜你喜欢
        • 2012-11-14
        • 2012-08-06
        • 2012-09-21
        • 2011-12-26
        • 2014-07-05
        • 2015-03-10
        • 2015-09-28
        • 1970-01-01
        • 2013-01-10
        相关资源
        最近更新 更多