UML聚合关系是否可以双向?

3

我正在使用Python实现一个MVC模式的应用程序,以下是类定义:

class Controller(object):
    def __init__(self, model, view):
        self.model = model
        self.view = view

        self.view.register(self)

class Model(object):
    def __init__(self):
        pass

class View(object):
    def __init__(self):
        self.controller = None

    def register(self, controller):
        self.controller = controller

类是由实例化产生的

model = Model()
view = View()
Controller(model, view)

控制器可以访问视图,但视图也可以访问控制器(因为控制器将自身传递给视图)。在UML中表示这种结构的适当方式是什么? 我猜测应该是:

MVC的UML图表

但我不确定两个方向上的聚合是否存在。

2个回答

1
您正在使用共享组合(空心菱形)。引用规范书第110页的内容:
“表示属性具有共享聚合语义。共享聚合的精确语义因应用领域和建模者而异。”
因此,除非您有自己的语义定义,否则不建议通常使用它。
如果您想使用复合聚合,则禁止在两侧同时使用。这意味着每个连接元素的生命周期取决于另一个元素的生命周期。
引用下面的第110页:
“组合可以链接到具有传递删除特性的有向无环图中;也就是说,在图的某一部分删除对象也将导致删除该对象下面子图中的所有对象。”
双向不是无环的。

-1

(UML 2.5 第9.5.3节)

[composite] 表示该属性被组合聚合,即复合对象对所组成的对象的存在和存储负有责任

因此,双向组合没有意义,因为您不能双向承担存在的责任 - 一旦一方销毁了另一方,另一方就无法销毁第一个。

此外,在您的MVC示例中使用聚合也是不正确的,因为控制器不负责模型的生命周期;实际上,一个模型可以从许多不同的控制器中使用。

因此,只需使用常规关联,具有单向和双向可导性。

enter image description here


聚合不同于组合。组合是一种同时表示所有权的聚合。 - CygnusX1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接