类图和类属性中的聚合

时间:2013-10-31 17:03:44

标签: oop uml class-design class-diagram

在关于类图的讲座中,出现了以下幻灯片,其中描述了Elevator系统中的关系:

Elevator system

讲座称黑头箭是一种“复合聚合”关系,这意味着孩子不能独立于父母而存在。

在此电梯系统示例中,Motor对象在Elevator对象外部无关紧要。

我不明白的是复合聚合如何出现在代码本身中。我希望电梯里有一个“myMotor”属性,但没有。

是不是因为通过绘制这种关系,我们告诉程序员他需要实现它,但是他可以选择实现细节吗?

与明确陈述的父对象的属性相反(如电梯的isActive布尔属性)?

3 个答案:

答案 0 :(得分:1)

U.M.L。可以用几种方式作为非常概念化的设计工具或更具体的编程设计工具。

因此,在表示复合聚合时,它可以用多种方式表示。

  • 有时,您可能希望显示班级的所有成员。当成员太多时,这很糟糕。
    +--------------------------+
    |       ElevatorClass      |
    +--------------------------+
    | [+] boolean:   isActive  |
    | [+] boolean:   isInOrder |
    | [+] Floor:     Location  |
    | [+] MotorClass:   Motor  |
    | [+] DoorClass:    Door   |
    +--------------------------+
    | [+] startOperation()     |
    | [+] stopOperation()      |
    | [+] gooUp()              |
    | [+] gooDown()            |
    | [+] openDoor()           |
    | [+] closeDoor()          |
    +--------------------------+
  • 有时,您可能希望隐藏班级的所有成员。好的,当你想专注于课堂时,而不是成员。注意:这可能是您现在正在查看的情况。
    +--------------------------+1       1+--------------------------+
    |       ElevatorClass      |------<*>|     RescueButtonClass    |
    +--------------------------+         +--------------------------+
  • 有时,您可能希望显示某个类的某些成员,并隐藏另一个成员。
    +--------------------------+ 1     1 +--------------------------+
    |       ElevatorClass      |------<*>|      MotorButtonClass    |
    +--------------------------+         +--------------------------+
    | [+] boolean:   isActive  |
    | [+] boolean:   isInOrder |
    | [+] Floor:     Location  |
    | [+] MotorClass:   Motor  |
    | [+] DoorClass:    Door   |
    +--------------------------+

为了使事情有点复杂,电梯以及其他元件不必由电梯类中的参考成员引用。

示例(c样式):

class ElevatorClass {
public:
  List<ComponentClass*> Components;

  ...

  void AddComponent(ComponentClass* ThisComponent);
} // class ElevatorClass

...

MyElevator.AddComponent(MyMotor);

在前面的代码示例中,不直接引用该成员。

就我个人而言,我非常同意这一点:

class ElevatorClass {
public:
  MotorClass* Motor;
  MotorClass* Motor;
} // class ElevatorClass

干杯。

答案 1 :(得分:0)

对于复合聚合(也称为合成),USUALLY这表示父子关系。在您的示例中,代码中的Elevator对象将仅包含对一个Motor对象的引用。这是一篇博文的链接,可以更好地解释它。查找“合成”部分:

http://aviadezra.blogspot.com/2009/05/uml-association-aggregation-composition.html

我认为这种表示对于所有被描绘的对象都有意义,除了StopRequest。就个人而言,我不会将其描述为Elevator对象的组合,但请记住,UML并不是一门精确的科学。

答案 2 :(得分:0)

您的假设是正确的 - UML关系未指定实施细节。在组合的情况下,要求是Motor对象生存期限于包含Elevator对象生存期。这可以通过多种方式实现(并且取决于您使用的语言)。它可以是Elevator内的属性,在这种情况下,它将与包含Elevator一起自动销毁。另一方面,它可以是在包含Elevator对象的生命周期中手动实例化和释放的外部对象。实现取决于具体情况和其他设计考虑因素,例如简单性,灵活性,模块化等。

可以在图表中添加许多细节。图表的创建者需要考虑要包含的内容和省略的内容。例如,私有属性通常与实现细节有关,对类图不感兴趣,因此不会提及它们。提到的属性明确暗示包含对象和属性之间的组合关系。这种概念通常用于原始属性,例如boolean,int等。对于更复杂的属性,通常使用显式UML关系来描述对象之间的关系(如ElevatorMotor之间)