类定义中的聚合和组合表示?

时间:2011-07-12 17:43:48

标签: uml

聚合是一个整体/部分关系。如果整体不再存在,但部分仍然存在

但是在构图中如果整体不再存在,但部分将不再存在

例如,一所大学拥有各个部门(例如化学),每个部门都有一些教授。如果大学关闭,部门将不复存在,但这些部门的教授将继续存在。因此,大学可以被视为一个部门的组合,而部门则有教授的集合。

我的问题在于我们如何在java中实际定义大学,系和教授的类定义,这也描述了上述聚合和组合行为?

2 个答案:

答案 0 :(得分:4)

组合和聚合的概念用UML中的菱形箭头显示,但是当这些概念用编程语言实现时,可能会从一种编程语言变为另一种编程语言。

一般来说,在Java,C#或Delphi等编程语言中,两种情况都由对象引用表示。每个对象都有一个“生命周期”(“创建”,“做东西”,“被破坏”)。

package Universities;

class ProfessorClass {
  string FirstName;
  string LastName;

  // constructor
  public ProfessorClass(string AFirstName, string ALastName) {
    FirstName = AFirstName;
    LastName = ALastName;
  } 
} // class ProfessorClass

class DepartmentClass {
  string Name;
  string Description;

  // constructor
  public DepartmentClass(string AName, string ADescription) {
    Name = AName;
    Description = ADescription;
  } 
} // class DepartmentClass

class UniversityClass {
  // here doesn't look different:

  // aggregation
  ProfessorClass[] Professors;
  // composition
  DepartmentsClass[] Departments;

  // constructor
  public UniversityClass() {
    // "UniversityClass" is in charge of creating parts

    // here doesn't look different:

    DepartmentsClass = new DepartmentsClass[]();

    ProfessorClass = new ProfessorClass[]();
  } 

  public addDepartment(string AName, string ADescription)
  {
  // composition, whole class is in charge of adding parts:
    DepartmentClass Dept = new DepartmentClass(AName, ADescription);
    DepartmentsClass.add(Dept);
  }

  public deleteDepartment(string AName)
  {
  // composition, whole class is in charge of deleting parts:
    DepartmentsClass.delete(AName);
  }

  public addProfessor(ProfessorClass AProfessor)
  {
    // aggregation, whole class only reference other objects,
    // but, may look like they where parts
    ProfessorClass.add(AProfessor);
  }

  public static void main(String[] args) {
    UniversityClass MyUniversity = new UniversityClass();

    // composition, internal, maintained by main class
    MyUniversity.addDepartment("History", "Very Boring");
    MyUniversity.addDepartment("Music", "Only if you like it");
    MyUniversity.addDepartment("Astronomy", "night living people");

    // aggregation, external, referenced by main class,
    // maintained independently
    ProfessorClass Professor1 = new ProfessorClass("Jane", "Doe");
    ProfessorClass Professor2 = new ProfessorClass("Mike", "Smith");
    ProfessorClass Professor3 = new ProfessorClass("Louise", "Kent");

    MyUniversity.addProfessor(Professor1);
    MyUniversity.addProfessor(Professor2);
    MyUniversity.addProfessor(Professor3);  
  } // static void main(...)

} // class UniversityClass

在构图中,由其他对象(“部分”)组成的“整体”对象负责创建,使用&摧毁它的部分。 “整体”对象负责其每个“部分”的“生命周期”。

在聚合中,引用其他对象(“聚合”)的“整个”对象(通常看起来类似于“部件”(组合))不会被主要对象创建或销毁,只是分配或取消分配。主对象不直接控制其他对象,只需添加或删除引用。

有些时候你可能会从其他开发者那里选择代码alredy,并且可能会看到两个想法,混合,并且无法区分使用哪个概念。

答案 1 :(得分:0)

让我们设定条款。 Aggregation是UML标准中的元项,意味着BOTH组合和共享聚合,简称为 shared 。它经常被错误地命名为“聚合”。它是坏的,因为组合也是聚合。据我了解,您的意思是“共享”。

进一步来自UML标准:

  

composite - 表示属性是复合聚合的,   即复合对象对存在和存在负责   存储组合对象(部分)。

所以,大学到cathedras协会是一个组合,因为大学(IMHO)不存在大教堂

  

共享聚合的精确语义因应用领域而异   建模器。

即,如果您只遵循您或其他人的某些原则,则可以将所有其他关联绘制为共享聚合。另请查看here