如何在UML中对MVC类图进行建模?

时间:2019-03-30 03:53:30

标签: oop model-view-controller uml

我正在用UML建模电影票系统。我需要使用MVC,所以我必须有一个Model;它控制数据库中的可用票证,即视图;询问客户一些数据和一个控制器;它控制着一切,是模型和视图之间的路径。事实是,我像这样对这个系统建模:

MVC Class diagram

但是我的老师说我不能在Controller和View and Model之间使用 Composition 关系。但是我不明白为什么,因为如果我在Controller内部初始化了Model和View(以便它可以控制所有内容),那么当Controller死亡时,(Model和View)都将不复存在。我的老师说我必须使用 Association 关系。你能告诉我什么是正确的恋爱关系,为什么?

2 个答案:

答案 0 :(得分:0)

p上的UML规范。 110说:

  

composite-表示该属性是复合聚合的,即,复合对象负责所组成对象的存在和存储(请参见11.2.3中各部分的定义)。

     

复合聚集是聚集的一种强大形式,它要求一次将一个对象最多包含在一个复合对象中。如果删除了一个复合对象,则随即删除作为对象的所有零件实例。

因此很明显,控制器无法组成Model,因为那是永久存储数据的原因。一个组合意味着:如果控制器死亡,模型也将死亡。

关于您使用的共享聚合(第110页的同一框):

  

shared-表示属性具有共享的聚合语义。共享聚合的精确语义因应用程序区域和建模器而异。

因此,您需要指定使用时的实际含义。或者(甚至更好)就把那颗钻石丢掉!

答案 1 :(得分:0)

MVC模式中的Controller管理模型和视图之间的交互,它们都是可以独立存在的独立事物,因此它引用(关联) ),它们不是它(组成)的复合部分。

我还要在您的UML类模型示例中指出,术语 Model View Contoller 中的解决方案构造设计模式,而不是设计或实现中必须具有的特定类型。您的方案中的“模型”实际上可能是 Ticket 业务实体,也可能是许多其他实体。 “视图”可能是“ TicketDetailsView”或“ ListTicketsView”,“控制器”将是“ TicketController”。在SmallTalk中嵌入的原始MVC模式中,View可以直接读取模型,而Controller则可以操纵模型,而现在MVC模式的许多变体中的关联并不完全相同(MVP,MVVM,MVPC,页面控制器等)。

作为参考,我强烈建议阅读Fowler(https://martinfowler.com/eaaDev/uiArchs.html)。