12

再一次,一个与 MVC 相关的问题。几天前,我开始阅读 Apple 的 Cocoa Fundamentals Guide,其中 Apple 解释了他们的 MVC 实现。

在 MVC as a Compound Design Pattern (链接) 一章中,他们比较了两个 MVC 版本:

  • 旧/传统 SmallTalk 版本: 在此处输入图像描述

  • 当前 Apple 定义的版本: 在此处输入图像描述

他们对当前模型的描述如下:

这种复合设计模式中的控制器对象结合了中介者模式和策略模式;它在两个方向上调解模型和视图对象之间的数据流。 模型状态的变化通过应用程序的控制器对象传达给视图对象。

传统的模式看起来像 MVC,没有错。但是他们当前模式的名称让我感到困惑。据我所知,这可以看作是简单的MVP,因为控制器似乎总是在视图和模型之间进行调解。

我完全错了,我误解了 MVC 还是 MVP?还是 Apple 只是为这种模式使用了错误的名称?更重要的是,为什么这种当前模式被称为 MVC?

4

2 回答 2

11

您没有错,Apple 文档的作者也没有错。

MVC 的历史现在漫长而复杂——尤其是因为许多系统提倡三方分离,这实际上将控制器混入模型或将控制器混合到视图中。从早期的 Smalltalk 实现中,很明显将模型信息保持在视图之外是一件非常好的事情,而且这很容易做到。

另一方面,清晰地分离控制器和视图的职责就不那么简单了。许多视图都希望被重用,例如按钮或文本字段。他们的控制器的可重用部分也希望被重用。但是您不会按下文本字段或加粗按钮;许多按钮行为与视图密切相关。同时,很难确定业务规则何时属于模型以及何时属于控制器。

此外,这份(非常好的)Apple 文档试图捕捉一种哲学设计理念,而不是描述 The One True Way。许多 Cocoa 控制器子系统看起来很像传统的 MVC。传统的 cocoa 不再强调控制器,因此本文档本质上是在争论给它们一个作为(可重用)视图和(潜在可重用)模型之间的中介的位置。

许多 Cocoa 实现者更喜欢瘦控制器,本质上作为外观来解耦视图和模型。

于 2013-02-18T19:55:30.050 回答
3

由于 MVP 是 MVC 的一个子集,因此在 MVC 系统中找到它并不奇怪。是的,第二张图说明了 MVP 模式。

Apple 称它为中介控制器——我综合起来——只是 MVP 的另一个名称。

坦率地说,我不确定MVP这个词是否应该流行起来。这意味着它是一种完全不同的模式,并且演示者似乎专注于 UI,而有时它只是模型和控制器之间的关系。中介控制器非常简单地描述了这种区别。

我不得不查看 MVP 甚至知道你在问什么。该术语在 1996 年的一篇论文中使用。当 OS X 发布时,它仍然是新的。

于 2013-02-18T19:56:32.267 回答