什么应该拥有MVC模式的模型?
自从我记得以来,我一直在制作iOS应用程序,但直到最近我还没有实现编程风格,直到最近我有一个实习编程。 我很早就学到了很多面向对象的概念,因为我意识到生活中对他们的了解是多余的,但是我从来没有学过的东西是MVC模式。
为了给出上下文,假设我在单个SolarSystemView
( UIView
一个子类)内绘制了一个太阳系。 我的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)之间。