MVC(Model-View-Controller,模型—检视—控制器模式)是软件项目中的一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),检视(View)和控制器(Controller)。
MVC最早由Trygve Reenskaug在1974年[1]提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。模型—检视—控制器模式的目的是实作一种动态的程序设计,使后续对程序的修改和扩充套件简化,并且使程序某一部分的重复利用成为可能。除此之外此模式透过对复杂度的简化使程序结构更加直觉。软件系统透过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。专业人员可以透过自身的专长分组:
- 控制器- 负责转发请求,对请求经行处理。
- 检视 - 接口设计人员进行图形接口设计。
- 模型 - 程序设计师编写程序应有的功能(实作算法等等)、数据库专家进行数据管理和数据库设计(可以实作具体的功能)。
目录 [隐藏] |
层次
模型(Model) 「数据模型」(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。「模型」有对数据直接存取的权利,例如对数据库的存取。「模型」不依赖「检视」和「控制器」,也就是说,模型不关心它会被如何显示或是如何被操作。但是模型中数据的变化一般会透过一种重新整理机制被公布。为了实作这种机制,那些用于监视此模型的检视必须事先在此模型上注册,从而,检视可以了解在数据模型上发生的改变。(比较:观察者模式(软件设计模式))
检视(View) 检视层能够实作数据有目的的显示(理论上,这不是必需的)。在检视中一般没有程序上的逻辑。为了实作检视上的重新整理功能,检视需要存取它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。
控制器(Controller) 控制器起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。「事件」包括使用者的行为和数据模型上的改变。
优点
在最初的JSP网页中,像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。经验比较丰富的开发者会将资料从表示层分离开来,但这通常不是很容易做到的,它需要精心地计划和不断的尝试。MVC从根本上强制性地将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它带给我们的好处是毋庸置疑的。
首先,多个检视能共享一个模型。如今,同一个Web应用程序会提供多种使用者接口,例如使用者希望既能够透过浏览器来收发电子邮件,还希望透过手机来存取电子邮箱,这就要求Web网站同时能提供Internet界面和WAP界面。在MVC设计模式中,模型响应使用者请求并返回响应数据,检视负责格式化数据并把它们呈现给使用者,业务逻辑和表示层分离,同一个模型可以被不同的检视重用,所以大大提高了代码的可重用性。
其次,模型是自包含的,与控制器和检视保持相对独立,所以可以方便的改变应用程序的数据层和业务规则。如果把数据库从MySQL移植到Oracle,或者把RDBMS数据源改变成LDAP数据源,只需改变模型即可。一旦正确地实作了模型,不管数据来自数据库还是LDAP服务器,检视都会正确地显示它们。由于MVC的三个模块相互独立,改变其中一个不会影响其它两个,所以依据这种设计思想能构造良好的松耦合的构件。
此外,控制器提高了应用程序的灵活性和可配置性。控制器可以用来联机不同的模型和检视去完成使用者的需求,也可以构造应用程序提供强有力的手段。给定一些可重用的模型和检视,控制器可以根据使用者的需求选择适当的模型机型处理,然后选择适当的的检视将处理结果显示给使用者。
缺点及适用范围
MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。开发一个MVC架构的项目,将不得不花费相当可观的时间去考虑如何将MVC运用到应用程序中,同时由于模型和检视要严格的分离,这样也给侦错应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。另外由于MVC将一个应用程序分成了三个部件,所以这意味着同一个项目将包含比以前更多的档案。
因此MVC并不适合小型甚至中等规模的应用程序,这样会带来额外的工作量,增加应用的复杂性。但对于开发存在大量使用者接口,并且逻辑复杂的大型应用程序,MVC将会使软件在健壮性、代码重用和结构方面上一个新的台阶。尽管在最初构建MVC框架时会花费一定的工作量,但从长远的角度来看,它会大大提高后期软件开发的效率。
实作
微软所推出的MFC Document/View架构是早期对于MVC的实作,MFC将程序分成CView以及CDocument两大类别,其中的Document对应MVC中的Model,View相当于MVC中的View+Controller,再加上CWinApp类别,合成三大项。但是基本上MFC是一个失败的MVC作品。
由于MFC之下的Document/View定义过于模糊,未将Controller(MessageMap)部份取出,因此Controller可以置入View或Document,但不管置入哪一方面,都会与View或Document绑死,没有弹性。
Java 平台企业版 (J2EE)
和其它的各种框架不一样,J2EE为模型对象(Model Objects)定义了一个规范。
检视(View)
在J2EE应用程序中,检视(View)可能由Java Server Page(JSP)承担。生成检视的代码则可能是一个servlet的一部分,特别是在客户端伺服端互动的时候。
控制器(Controller)
J2EE应用中,控制器可能是一个servlet,现在一般用Struts实作。
模型(Model)
模型则是由一个实体Bean来实作。
Java Swing
ASP.NET
在ASP.NET中,针对检视(View)和控制器(Controller)的模式没有被很好地定义。而模型(Model)则留给开发者去设计。
检视(View)
ASPX和ASCX档案被用来处理检视的职责。在这个设计中检视实际上是从控制器继承而来。这个和Smalltalk的实施有所不同,在Smalltalk中不同的类都有指标互相指向对方.
控制器(Controller)
控制器的职责被分割成两部分。事件(Event)的产生和传输是框架的一部分,更明确的说是Page和Control两个类。而事件的处理则在分离的代码中实作。
模型(Model)
ASP.NET 不严格需要一个模型。开发者可以自行选择创建一个模型类,但是很多人选择放弃这一步,直接把事件处理放在控制器里处理任何计算、数据保存等等。但用模型来包含商业逻辑和数据存取是可实作的。
ASP.NET MVC
针对原本ASP.NET对于MVC的架构支持的不足,而预计在ASP.NET 4.0中推出ASP.NET MVC这个新的Framework。
Windows Forms
在WinForms中,这个针对检视(View)和控制器(Controller)的模式已经很好的定义好的。而模型(Model)则留给开发者去设计。
检视(View)
由Form或者Control类继承来的一个类处理检视的职责。在WinForm这个例子中检视和控制器被编译在同一个类中,这个和ASP.NET不同。
控制器(Controller)
控制器的职责被分割成三部分。事件(Event)的产生和传输是操作系统的一部分。在.Net框架中Form和Control类将不同的事件转发给相应的事件处理器。而事件的处理则在分离的代码中实作。
模型(Model)
就像ASP.NET一样,WinForm不严格需要一个模型。开发者可以自行选择创建一个模型类,但是很多人选择放弃这一步,直接把事件处理放在控制器里处理任何计算、数据保存等等。也就是说用模型来包含商业逻辑和数据存取。
Perl
Catalyst和Jifty是透过Perl语言所开发出来的Web Framework,都采用Model-View-Controller架构。Catalyst 本身只是做了 Controller,View 和 Model 让开发者自由选用 CPAN 上的模块开发,例如 Template 和 Template Declare 都可用来产生视图。Jifty 将 MVC 完全实做完成,View 的部份在早期版本使用 Mason 实做,较新版本使用 Template Declare。
Ruby on Rails
Ruby on Rails是透过Ruby语言所开发出来的Web Framework,也是采用Model-View-Controller架构。Model 部份使用 Active Record 概念实做,加上 Migration 机制,使得其 Model 结构非常容易控制。
Python
Python 有许多的 MVC 架构。最常用的有 Django 和 TurboGears。
JavaScript
PHP
ActionScript 3
参考数据
1. ^ Trygve M. H. Reenskaug/MVC—XEROX PARC 1978-79
外部连结
- An overview of the MVC pattern in Java from the Sun website
- Model View Presenter with ASP.NET CodeProject article.
- History of the evolution of MVC and derivatives by Martin Fowler.
- ASP.NET MVC Framework Microsoft's Scott Guthrie on .NET MVC
- Introduction to the ASP.NET Model View Controller (MVC) Framework Scott Hanselman builds an application step-by-step using the first CTP of the ASP.NET MVC Framework in this Introductory Video
- Holub, Allen.Building user interfaces for object-oriented systems,Java World.
- Greer, Derek. "Interactive Application Architecture Patterns", Ctrl-Shift-B, 2007.
- Building Graphical User Interfaces with the MVC Pattern in Java
- What is behind MVC
取自"http://zh.wikipedia.org/zh-tw/MVC"