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

标签 uml

聚合是一种整体/部分关系。如果整体不复存在,但部分还会存在

但是在组合中如果整体不存在了,但是部分也将不存在

例如,一所大学拥有多个系(例如化学系),每个系都有多名教授。如果大学关闭,院系将不复存在,但院系的教授将继续存在。因此,一所大学可以看作是系的组合,而系则是教授的集合。

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

最佳答案

组合和聚合的概念在 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

在组合中,由其他对象(“部分”)组成的“整体”对象负责创建、使用和销毁其部分。 “整体”对象负责其每个“部分”的“生命周期”。

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

有时您可能会选择其他开发人员已经完成的代码,并且可能会看到两种想法,混淆,并且无法区分使用了哪个概念。

关于uml - 类定义中的聚合和组合表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6668615/

相关文章:

uml - 为什么 IDEF 不流行而 UML 流行?

php - 在我的设计模型中混合使用 Javascript 和 PHP

eclipse-plugin - 序列图中的 Action 执行规范用法

c++ - UML 图中的运算符重载

uml - Xpand中UML PrimitiveType的Property的Type字段未填写

uml - 如何绘制带有嵌套 if 语句的 UML 图?

c++ - 如何在 UML 类图中描述指向类的指针?

c++ - 建议将 cpp 代码转换为 UML 类图的工具

java - 计算机术语中的前置条件,后置条件和不变量有什么区别

uml - 究竟什么时候应该在分层状态机上执行转换 Action ?