M、V、C之间有很强的关联性与独立性,看似矛盾的解释,却有十分奥妙的分工与合作关系。
彼此的关联性
以”常规的“MVC解释法,彼此的关系如图所示:
Controller与View的关联性
在Controller与View的关联性上,彼此都是双向关系,但Controller的主动性较高。
当Controller为”主动“角色时:
Controller可决定要显示哪一个View
当View为"主动”角色时:
View可决定数据要送回到哪一个Controller的Action。
当View需要数据时,可决定数据应该从哪一个Controller的Action取得。
View与Model的关联性
在View与Model的关联性上,View是站在“比较主动”的一方,而Model则是一个“数据服务提供商”的角度出发。
View的数据基本上是从Controller传过来的,而传过来的数据型别却是Model所定义的。因此,View与Model之间大多是“彼此参考”的关系,也就是View会参考Model中的型别定义。如图所示
若是发现从Controller传到View的数据不足以完整显示,此时,View的角色就会立即转变为“主动”,直接对Model进行数据查询,并获得数据。例如,欧诺个过ORM技术,可能会有延迟装入的机制,实际取得数据的时机,将是在View显示数据的时候。除此之外,一般在规划网站时,通常会先规划界面的外观,借此定义该界面应该会出现什么数据或字段。
Model与Controller的关联性
在Controller与Model的关联性中,Controller永远居于“主动”的角色。Controller负责调用或使用Model所定义的各种类别,而Model很单纯的仅仅提供“数据服务”或“验证服务”给Controller使用。
彼此的独立性
虽然M、V、C之前看似关联十分紧密,但是彼此间又不能拥有太强的相依性,否则就会失去我们采用MVC的初衷,因此M、V、C彼此之间的关系必须恰到好处。
Controller与View之间的独立性
从前面的内容可以发现,Controller跟View与Model都有关联性,彼此之间维持着一种信任关系,称之为“Convention(常规)”。
在大部分的Controller定义中,通常不会明确指定要显示哪张View,而是由MVC Framework依据常规帮你选出相关的View来显示,这就是Controller与View之间的独立性。
换句话说,当View尚未被建构时,Controller其实可以先撰写程序。相对来说,View与Controller的关系,大多是由Controller主动去挑选适合的View来显示,所以,View本身对于“输出”的任务来说,是处于一个非常独立的状态。因此,当Controller尚未被构建时,View也可以先撰写程序。
View与Model之间的独立性
View大多参考自Model里所定义的型别,但这并非绝对必要的。View不需要Model也能够运行,只是这样View就会缺乏Model所能提供的数据型别定义。这会造成View在开发时没有那么方便。
Model与Controller之间的独立性
Model是贯穿全局的重要角色。有趣的是,在没有Model的情况下,Controller与View一样可以运行得很好。例如,我们在显示“静态页面”时,没有任何动态数据的情况下,Controller不需要从Model取得数据,彼此之间当然就没什么关系了。