MVC的创建者是Trygve M. H. Reenskau,他是挪威的计算机专家,同时也是奥斯陆大学的名誉教授。MVC是他在1979年访问施乐帕克研究中心(Xerox Palo Alto Research Center,Xerox PARC)期间提出一种主要针对GUI应用的软件架构模式。MVC最初用于SmallTalk,Trygve最初对MVC的描述记录在Applications Programming in Smalltalk-80(TM):How to use Model-View-Controller (MVC)这篇论文中,有兴趣的读者可以通过地址http://st-www.cs.illinois.edu/ users/smarch/st-docs/mvc.html阅读这篇论文。
MVC体现了关注点分离这一基本的设计方针,它将构成一个人机交互应用涉及的功能分为Model、Controller和View三部分,它们各自具有相应的职责。
Model是对应用状态和业务功能的封装,我们可以将它理解为同时包含数据和行为的领域模型(Domain Model)。Model接受Controller的请求并完成相应的业务处理,在状态改变的时候向View发出相应的通知。
View实现可视化界面的呈现并捕捉最终用户的交互操作(比如鼠标和键盘操作)。
View捕获到用户交互操作后会直接转发给Controller,后者完成相应的UI逻辑。如果需要涉及业务功能的调用,Controller会直接调用Model。在完成UI处理之后,Controller会根据需要控制原View或者创建新的View对用户交互操作予以响应。
图1-1揭示了MVC模式下Model、View和Controller之间的交互。对于传统的MVC模式,很多人认为Controller仅仅是View和Model之间的中介,实则不然,View和Model存在直接的联系。View可以直接调用Model查询其状态信息。当Model状态发生改变的时候,它也可以直接通知View。比如在一个提供股票实时价位的应用中,维护股价信息的Model在股价变化的情况下可以直接通知相关的View改变其显示信息。
图1-1 Model-View-Controller之间的交互 |
从消息交换模式的角度来讲,Model针对View的状态通知和View针对Controller的用户交互通知都是单向的,我们推荐采用事件机制来实现这两种类型的通知。从设计模式的角度来讲就是采用观察者(Observer)模式通过注册/订阅的方式来实现它们,即View作为Model的观察者通过注册相应的事件来检测状态的改变,而Controller作为View的观察者通过注册相应的事件来处理用户的交互操作。
我看到很多人将MVC和所谓的"三层架构"进行比较,其实两者并没有什么可比性,MVC更不是分别对应着UI、业务逻辑和数据存取三个层次,不过两者也不能说完全没有关系。Trygve M. H. Reenskau当时提出MVC的时候是将其作为构建整个GUI应用的架构模式,这种情况下的Model实际上维护着整个应用的状态并实现了所有的业务逻辑,所以它更多地体现为一个领域模型。而对于多层架构来说(比如我们经常提及的三层架构),MVC是被当成UI呈现层(Presentation Layer)的设计模式,而Model则更多地体现为访问业务层的入口(Gateway)。如果采用面向服务的设计,业务功能被定义成相应服务并通过接口(契约)的形式暴露出来,这里的Model还可以表示成进行服务调用的代理。