模型 - >观察者 - >查看 - >控制器 - >模型 - >

时间:2017-05-05 08:10:33

标签: javascript design-patterns model-view-controller

我正在阅读设计模式,虽然作者同意观察者模式很酷,但在设计方面,每个人都会谈论MVC。

我有点困惑,MVC图不是循环的,代码流是否自然具有封闭拓扑?为什么没人说这种模式:

model -> observer -> view -> listener -> model -> ..

如果view需要controller,那么model需要观察者,不是吗?随着Object.observe()与下一个JavaScript版本一起出现,这样的模式有什么问题my pattern

1 个答案:

答案 0 :(得分:2)

视图和控制器都是观察者。

视图/是/观察者,模型上的事件。 controller /是视图中事件的观察者。控制器在模型上触发命令,导致它改变传播视图观察到的事件,这些事件会适当地改变其状态。

这是试图解决的问题是让UI响应模型中的变化,让模型通过UI响应用户的输入。除了人类视觉的脆弱之外,没有很好的理由让第三个组成部分参与其中 - 设想一个命令和控制系统比一个事件驱动的系统要容易得多,尽管令人惊讶的是后者通常更容易实现。

您提出的设计存在的一个问题是关注点的分离。使用MVC(当正确完成时,使用消息/事件),每个组件只知道自己和自己的关注点。使用该模型,您提出的Observer组件必须知道如何编排视图,视图最适合自己进行操作。

当然,您认为控制器会协调对模型的更改,那么为什么我们不能在关系的另一端拥有一个等效组件呢?

事实上,虽然我们通常会在“控制器”中实现某些功能。空间,它通常只是基础设施和#39;将消息/事件/命令从视图传递到模型,模型会相应地做出响应 - 也就是说,控制器通常会转换为简单的路由器。由于我们对DDD和聚合根模式的更好理解,以及事件采购的可能性,现代设计中对编排组件的需求已经减少。

最后,你所指的模式最初由四人组记录,在实践中存在并且相对常见。当时没有移动或webapps,他们认为最大的系统之一是gimp。随着我们的技术日趋成熟,我们的应用程序通过多种渠道提供,因此在此领域拥有开发模式。几年前我们讨论MVC2,然后我们转向MVVC和MMVC这样的怪异事物。现在,通过CQRS,事件采购和DDD,我们已经开始讨论MV,因为编排方法已经开始显示其局限性和事件驱动系统脱颖而出。