Oop 类图和类属性中的聚合
在关于类图的讲座中,出现了以下幻灯片,描述了电梯系统中的关系: 讲座将黑头箭头称为“复合聚合”关系,这意味着孩子不能独立于父母而存在 在本电梯系统示例中,电动机对象与电梯对象外部无关 但我不明白的是,复合聚合在代码中是如何出现的。我希望电梯里会有一个“我的马达”,但实际上没有 是因为通过绘制这种关系,我们告诉程序员他需要实现它,但实现细节是他自己选择的吗Oop 类图和类属性中的聚合,oop,uml,class-design,class-diagram,Oop,Uml,Class Design,Class Diagram,在关于类图的讲座中,出现了以下幻灯片,描述了电梯系统中的关系: 讲座将黑头箭头称为“复合聚合”关系,这意味着孩子不能独立于父母而存在 在本电梯系统示例中,电动机对象与电梯对象外部无关 但我不明白的是,复合聚合在代码中是如何出现的。我希望电梯里会有一个“我的马达”,但实际上没有 是因为通过绘制这种关系,我们告诉程序员他需要实现它,但实现细节是他自己选择的吗 与显式声明的父对象属性(如电梯的isActive boolean属性)相反,对于复合聚合(也称为合成),这通常表示父子关系。在您的示例中,代
与显式声明的父对象属性(如电梯的isActive boolean属性)相反,对于复合聚合(也称为合成),这通常表示父子关系。在您的示例中,代码中的电梯对象将只包含对一个马达对象的引用。这里有一个链接到一篇博客文章,可以更好地解释这一点。查看合成部分:
我认为这种表示法对所有图片中的对象都有意义,除了StopRequest。就我个人而言,我不会将其视为电梯对象的组成部分,但请记住,UML不是一门精确的科学。U.M.L.可以以多种方式用作概念设计工具或更具体的编程设计工具 因此,在表示复合聚合时,它可以用几种方式表示
- 有时,您可能希望显示类的所有成员。糟糕,当会员太多的时候
干杯。您的假设是正确的-
UML
关系没有指定实现细节。在组合的情况下,要求将电机
对象寿命限定为包含电梯
对象寿命。这可以通过几种方式实现(也取决于您使用的语言)。它可以是电梯
中的一个属性,在这种情况下,它将和包含电梯
的一起自动销毁。另一方面,它可以是一个外部对象,在包含电梯
对象的生命周期内手动实例化和释放。实现取决于具体情况和其他设计考虑因素,如简单性、灵活性、模块性等
有许多细节可以添加到图表中。图表的创建者需要考虑包括什么和省略什么。例如,私有属性通常与实现细节相关,对于类图来说并不有趣,因此不会提及它们。所提到的属性明确地暗示了包含对象和属性之间的组合关系。这种概念通常用于基本属性,如布尔、int等。对于更复杂的属性,通常使用显式UML关系来描述对象之间的关系(如电梯
和电机
)
+--------------------------+
| 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 |
+--------------------------+
class ElevatorClass {
public:
List<ComponentClass*> Components;
...
void AddComponent(ComponentClass* ThisComponent);
} // class ElevatorClass
...
MyElevator.AddComponent(MyMotor);
class ElevatorClass {
public:
MotorClass* Motor;
MotorClass* Motor;
} // class ElevatorClass