文档介绍:到底什么是MVC?
出处信息
先前整理过一篇文章,讲的是如何使用Php搭建Mvc框架,前几天看了一些文章,对MVC又有了新的认识,具体整理如下:
一、Classic MVC
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。最早由Trygve Reenskaug在1978年提出,并应用在Smalltalk系统中。
Classic Mvc模式:
Model:封装领域数据及逻辑。用于管理应用程序域的行为和数据,并响应为获取其状态信息(通常来自视图)而发出的请求,还会响应更改状态的指令(通常来自控制器)。
View:查询领域数据并展现给用户。用于管理信息的显示。
Conctroller:截获用户请求并改变领域数据。用于解释用户的鼠标和键盘输入,以通知模型和/或视图进行相应的更改。
从依赖关系看,Model不依赖View和Controller,而View和Controller依赖Model。
Classic MVC关注两个分离:
从Model中分离View
从View中分离Controller
从Model中分离View,主要基于以下几点考虑:
不同的关注点:Model关注内在的不可视的逻辑,而View关注外在的可视的逻辑。
多种表现形式:同一个Model往往需要多种View表现形式。
提高可测试性:相对Model而言,View是不容易测试的。
Desktop软件的时代,View和Controller往往是一一对应的关系,所以常常把他们合并成为UI,事实上,当时多数UI框架都没有实现从View中分离Controller。后来随着Web的兴起,这种分离(模板技术)才开始流行起来。
本质上Classic MVC的结构如下图所示,之所以说本质上,是因为View和Controller其实是彼此关联的,但这种关联和稍后提到的MVP完全不同,更像是一种框架的副产品,为了避免引起混淆,这里省略了它们,具体参阅:How to use Model-View-Controller (MVC)
Controller截获用户通过鼠标或键盘发出的请求,然后改变Model的状态,Model通过Observer Synchronization(观察者模式)通知View自己的状态发生了变化。View查询Model展现数据。
Classic MVC并不完美,不适用于复杂的逻辑。举个例子:用户通过鼠标拖动滚动条来调整音量大小,如果音量大于某个数值,背景色变红以示提醒。当使用Classic MVC的时候,如何处理背景色变红的逻辑呢?
有两个选择:
Model触发一个特殊事件,View收到后完成相关逻辑的处理。但我们前面说过,从依赖关系上看,Model应该完全无视View的存在。
在View中判断音量临界值,达到后完成相关逻辑的处理。但我们前面说过,View是不容易测试的,应该尽可能减少逻辑处理。
Classic MVC并不完美,不适用于复杂的逻辑。举个例子:用户通过鼠标拖动滚动条来调整音量大小,如果音量大于某个数值,背景色变红以示提醒。当使用Classic MVC的时候,如何处理背景色变红的逻辑呢?有两个选择:
Model触发一个特殊事件,View收到后完成相关逻辑的处理。但我们前面说过,从依赖关系上看,Model应该完全无视View的存在。
在View中判断音量临界值,达到后完成相关逻辑的处理。但我们前面说过,View是不容易测试的,应该尽可能减少逻辑处理。
上述只是提出了Classic MVC的一些缺陷,那到底如何解决呢?请继续关注下文~
二、Application Model MVC
大概上世纪八十年代,ParcPlace从Xerox Parc划分出来,负责Smalltalk的研发工作,为了适应更复杂的逻辑,开发了Classic MVC的改进版,也就是Application Model MVC,在原有架构基础上引入了Application Model,如下图所示:
Application Model在Model和View、Controller之间扮演着一个中继者的角色。接着看前面的例子,既然Model和View都不适合放背景色变红的逻辑,那么我们可以尝试把相关逻辑放在Application Model中实现,当用户通过鼠标调整音量大小时,Model触发一个普通事件,Application Model拦截到这个事件,判断音量是否大于临界值,如果是就触发一个特殊事件,View收到后完成相关逻辑的处理。
Application Model MVC虽然看似解决了复杂逻辑的问题,但