什么应该拥有MVC模式的模型?

自从我记得以来,我一直在制作iOS应用程序,但直到最近我还没有实现编程风格,直到最近我有一个实习编程。 我很早就学到了很多面向对象的概念,因为我意识到生活中对他们的了解是多余的,但是我从来没有学过的东西是MVC模式。

为了给出上下文,假设我在单个SolarSystemViewUIView一个子类)内绘制了一个太阳系。 我的SolarSystemView应该有一个SolarSystemView类的实例variables(一个包含所有重要的行星和stelar属性的数据结构的类),还是应该由一个SolarSystemViewController的实例拥有? 或者是完全不同的东西? 我找不到任何示例代码给出了令人满意的答案。

我想如果说这个视图拥有这个模型,那么操作就会非常stream畅,但是这样做也不是很好的风格。 毕竟, SolarSystem实例必须以某种方式dynamic更改,并且具有与SolarSystemView更新相同或相似的速率。

在MVC模式中,模型应该与View分离。 为了得到所需要的数据,它向控制器询问数据,然后询问模型。 这样,我们就可以从GUI中分离信息。 把它看作模型控制器查看是否有帮助。 因此,在大多数情况下,财务主任“拥有”模式。

例如,在cs193p中, CalculatorViewController (Controller)具有一个CalculatorBrain (Model)属性,它与之交互以获取方程的结果以显示在视图中。

在您的特定示例中, SolarSystemViewController可能会强烈引用SolarSystem ,它会轮询数据以切换SolarSystemView以便在需要更新时自行绘制。 当用户与SolarSystemViewController交互时, SolarSystemView也可能会通知SolarSystemViewController ,以便它可以显示其他视图或更新SolarSystem ,以及它可以执行的任何其他任务。

请注意,Cocoa和Cocoa Touch中的MVC范例与其他更广义的MVC有所不同,例如Smalltalk。 例如,如果您查看MVC上的维基百科页面,该图应该与您学习的内容看起来不同。 实际上,GoF( Design Patterns )就是这样描述MVC的。

MVC由三种对象组成。 Model是应用程序对象,View是其屏幕显示,Controller定义了用户界面对用户input的反应方式。 在MVC之前,用户界面devise倾向于将这些对象结合在一起。 MVC将它们分离以增加灵活性和重用性。 MVC通过在它们之间build立订阅/通知协议来解耦视图和模型。 视图必须确保其外观反映模型的状态。 只要模型的数据发生变化,模型就会通知依赖于它的视图。 作为回应,每个视图都有机会更新自己。 这种方法可以让您将多个视图附加到模型中,以提供不同的演示。 您也可以为模型创build新视图,而不必重写它。

在这两种情况下,模型本身正在联系视图来更新它。 但是,在iOS上,Model和View之间的交互是通过Controller来处理的。 这在cs193p的第一次会议以及苹果公司自己关于MVC关系的文档中有很好的解释。 这样,您只需重写Controller代码即可在其他位置重新使用模型和视图。

这是来自cs193p的MVC图解释。

模型视图控制器

在这种情况下,SolarSystemView不应包含SolarSystem类的任何时刻。 SolarSystemViewController应该放在你的视图(SolarSystemView)和模型(SolarSystem)之间。