【问题标题】:Aggregation and Composition representation in class definition?类定义中的聚合和组合表示?
【发布时间】:2011-07-12 17:43:48
【问题描述】:

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

但在构图中,如果整体不存在,部分就不存在了

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

我的问题是,我们将如何在 java 中实际定义 University、Department 和 Professors 的类定义,它还描述了上述聚合和组合行为?

【问题讨论】:

    标签: uml


    【解决方案1】:

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

    一般来说,在 Java、C# 或 Delphi 等编程语言中,这两种情况都由对象引用表示。每个对象都有一个“生命周期”(“created”、“do stuff”、“destroyed”)。

    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
    

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

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

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

    【讨论】:

    • 嗨 Umlcat 我正在寻找这些对象在 java 中的类定义以便更好地理解。
    • @Mohit Gupta Done,这是一个有点大的例子,需要时间来编码,它没有完全运行,只是一个近似的例子
    • 感谢 umlcat。但是我对上面的例子还有一个问题,那就是聚合和关联之间的区别是什么?看起来我们可以说大学与教授有关联,也可以说大学是教授的集合。哪个是对的?
    • @Mohit Gupta:“聚合”是代码中一种特殊的“关联”,你通常会使用组合和聚合,而不是直接关联
    【解决方案2】:

    让我们设定条款。 Aggregation 是 UML 标准中的一个元术语,表示组合和共享聚合,简称为 shared。它经常被错误地命名为“聚合”。这很糟糕,因为组合也是一种聚合。据我了解,您的意思是“共享”。

    UML 标准的进一步说明:

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

    因此,大学与大教堂协会是一个组合,因为大学不存在大教堂(恕我直言)

    共享聚合的精确语义因应用领域和 建模师。

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

    【讨论】:

      猜你喜欢
      • 2011-12-26
      • 2013-01-10
      • 1970-01-01
      • 2013-11-05
      • 2015-03-10
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多