繁体   English   中英

Java中使用类图的聚合和组合实现

[英]Aggregation and Composition Implementation in java using Class Diagram

我试图了解聚合和组成。
假设我有以下内容:
在此处输入图片说明

并且我想使用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? 如箭头所示(如果我正确理解了这些符号)。

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

您可以像做final那样用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(..........));
   }

}

您可以以类图为例,通过这种方式对其进行建模。 对于ClassA,请执行mihaisimi的操作:在ClassA的构造函数中实例化ClassB的列表。 如果要确切确定给定ClassA实例应包含多少个ClassB实例,只需将一个整数参数添加到构造函数中,并在它为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关联起来。 而且,如您所见,您不能向一个ClassB实例添加多个ClassC实例,并且ClassB的生存期并不严格地与ClassB关联。

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

有许多实现这种类图的正确方法。

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

我已经在我的网站上写了一篇关于该主题的文章: UML构成,聚合与关联

简而言之,组合是一种具有实际约束并影响发展的协会类型,而聚合纯粹是该协会性质的功能性指示,而没有技术影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM