再一次,与MVC相关的问题。几天前,我开始阅读Apple的Cocoa Fundamentals Guide,其中Apple解释了他们对MVC的实现。
在作为复合设计模式(link)的MVC一章中,他们比较了两个MVC版本:
旧的/传统的SmallTalk版本:
当前Apple定义的版本:
他们将此当前模型描述如下:
此复合设计模式中的控制器对象包含 中介模式以及战略模式;它调解流动 两个方向上的模型和视图对象之间的数据。 的变化 模型状态通过控制器传递给视图对象 应用程序的对象。
传统模式看起来像MVC,没有错。但他们目前的模式名称让我感到困惑。据我所知,这可以看作是普通MVP,因为Controller似乎总是在View和Model之间进行调解。
我完全错了,我是否误解了MVC或MVP?或者Apple只是使用了错误的名称?更重要的是,为什么这种当前模式称为MVC?
答案 0 :(得分:11)
你没错,但也不是Apple文档的作者。
MVC的历史现在漫长而复杂 - 尤其是因为许多系统提倡三方分离,实际上将控制器混淆到模型中或将控制器混合到视图中。从很早的Smalltalk实现开始,很明显将模型信息保留在视图之外是一件非常好的事情,而且这很容易做到。
另一方面,干净地分离控制器和视图的职责并不那么简单。许多观点都希望被重用,比如按钮或文本字段。他们的控制器的可重用部分也希望被重用。但是你不要推文字或按B按钮;许多按钮行为与视图紧密相关。同时,很难确定业务规则何时属于模型以及何时属于控制器。
此外,这个(非常好的)Apple文档试图捕捉一个哲学设计理念,而不是描述The One True Way。许多Cocoa控制器子系统看起来很像传统的MVC。传统的可可不强调控制器,所以本文件实质上是在为(可重用的)视图和(可能可重用的)模型之间的中介提供一个位置。
许多Cocoa实现者更喜欢瘦控制器,基本上用作外观来分离视图和模型。
答案 1 :(得分:3)
由于MVP是MVC的一个子集,因此在MVC系统中找到它并不奇怪。是的,第二张图说明了MVP模式。
Apple称它为中介控制器 - 我合成 - 只是MVP的另一个名称。坦率地说,我不确定 MVP 一词应该流行起来。这意味着它是一个完全不同的模式,演示者似乎专注于UI,有时它只是模型和控制器之间的关系。 中介控制器非常简单地描述了这种区别。
我不得不查看MVP甚至知道你在问什么。该术语于1996年在一篇论文中使用。当OS X发布时,它仍然是新的。