2013-10-31 42 views
3

在约类演讲图下面滑动出现其描述在电梯系统中的关系:聚合在类图和类属性

Elevator system

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

在此电梯系统示例中,电机对象在电梯对象外无关。

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

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

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

回答

0

对于组合聚集(也称为组合),USUALLY表示父子关系。在你的例子中,你的代码中的一个Elevator对象只包含一个对一个Motor对象的引用。这里是一个博客文章的链接,可以更好地解释它。认准组成部分:

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

我想,这表示是有道理的合照,除了可能StopRequest的所有对象。就我个人而言,我不会将它描绘成Elevator对象的组合,但请记住UML不是一门精确的科学。

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 | 
    +--------------------------+ 

为了使事情有点复杂,电动机,以及其他元素,不necesarilly必须由在电梯类的引用部件被引用。

例(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 

干杯。

0

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

有很多细节可以添加到图中。该图的创建者需要考虑包含什么以及要省略什么。例如,私有属性通常与实现细节有关,对于类图来说并不有趣,因此不会被提及。明确提到的属性意味着包含对象和属性之间的构成关系。这种概念通常用于原始属性,如布尔值,整型值等。对于更复杂的属性,通常使用显式UML关系来描述对象之间的关系(如ElevatorMotor之间)。