Loading AI tools
一种软件架构设计模式 来自维基百科,自由的百科全书
MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC模式最早由Trygve Reenskaug在1978年提出[1],是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。MVC模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式透过对复杂度的简化,使程序结构更加直观。软件系统透过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以依据自身的专长分组:
将应用程式划分为三种组件,模型 - 视图 - 控制器(MVC)设计定义它们之间的相互作用。[2]
在最初的JSP网页中,像数据库查询语句(SQL query)这样的数据层代码和像HTML这样的表示层代码是混在一起。虽然有着经验比较丰富的开发者会将数据从表示层分离开来,但这样的良好设计通常并不是很容易做到的,实现它需要精心地计划和不断的尝试。MVC可以从根本上强制性地将它们分开。尽管构造MVC应用程式需要一些额外的工作,但是它带给我们的好处是毋庸置疑的。
首先,多个 View 能共享一个 Model 。如今,同一个Web应用程式会提供多种用户界面,例如用户希望既能够通过浏览器来收发电邮,还希望通过手机来访问电子邮箱,这就要求Web网站同时能提供Internet界面和WAP界面。在MVC设计模式中, Model 响应用户请求并返回响应数据,View 负责格式化数据并把它们呈现给用户,业务逻辑和表示层分离,同一个 Model 可以被不同的 View 重用,所以大大提高了代码的可重用性。
其次,Controller 是自包含(self-contained,指高独立内聚)的物件,与 Model 和 View 保持相对独立,所以可以方便的改变应用程式的数据层和业务规则。例如,把数据库从MySQL移植到Oracle,或者把RDBMS数据源改变成LDAP数据源,只需改变 Controller 即可。一旦正确地实现了控制器,不管数据来自数据库还是LDAP伺服器,View 都会正确地显示它们。由于MVC模式的三个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的少互扰性的构件。
此外,Controller 提高了应用程式的灵活性和可配置性。Controller 可以用来连接不同的 Model 和 View 去完成用户的需求,也可以构造应用程式提供强有力的手段。给定一些可重用的 Model 、 View 和Controller 可以根据用户的需求选择适当的 Model 进行处理,然后选择适当的的 View 将处理结果显示给用户。
MVC模式在概念上强调 Model, View, Controller 的分离,各个模块也遵循着由 Controller 来处理消息,Model 掌管资料来源,View 负责资料显示的职责分离原则,因此在实现上,MVC 模式的 Framework 通常会将 MVC 三个部分分离实现:
也因为 MVC 模式强调职责分离,所以在发展 MVC 应用时会产生很多文件,在 IDE (集成开发环境) 不够成熟时它会是个问题,但在现代主流 IDE 都能使用类别物件的资讯来组织代码编辑的情况下,多文件早已不是问题,而且 MVC 模式会要求开发者进一步思考应用程式的架构 (Application Architecture),而非用大杂烩的方式开发应用程式,对于应用程式的生命周期以及后续的可扩展与可维护性而言有相当正面的帮助。另外,MVC 职责分离也带来了一个现代软件工程要求的重要特性:可测试性 (Testability),MVC-based 的应用程式在良好的职责分离的设计下,各个部分可独立行使单元测试,有利于与企业内的自动化测试、持续集成 (Continuous Integration) 与持续交付 (Continuous Delivery) 流程集成,减少应用程式改版部署所需的时间。
MVC 模式的应用程式的目的就是希望打破以往应用程式使用的大杂烩程序撰写方式,并间接诱使开发人员以更高的架构导向思维来思考应用程式的设计,因此对于一个刚入门的初学者来说,架构导向的思考会有一定的门槛,需要较多的实现与练习才能具备相应的能力,大多数的初学者还是较习惯于大杂烩式的程序撰写,所以可能会对 MVC 模式抱持着排斥或厌恶的心态,然而 MVC(或是其他的设计模式)都是有助于应用程式长远的发展,虽然大杂烩式的程序也可以用来发展长生命周期的应用程式,但是相较于 MVC,大杂烩式的程序在可扩展性和可维护性 (尤其是可测试性) 上会远比 MVC 复杂很多,相反的,MVC 模式的应用程式是在初始开发时期必须先思考并使用软件架构,使得开发时期会需要花较多心力,但是一旦应用程式完成后,可扩展性、可维护性和可测试性反而会因为 MVC 的特性而变得容易。
因此,MVC 模式在已有众多优秀 Framework 的现代,早就已经没有不适合小型应用的问题,小型的应用还是可以由 MVC Framework 的应用来获取 MVC 的优点,同时它也能作为未来小型应用扩展到大型应用时的基础与入门砖。若一开始就想要做大型应用,那么 MVC 模式的职责分离以及要求开发的架构思考会更适合大型应用的开发。
这里有一个通过 JavaScript 所实现的基于 MVC 模型,需要注意的是:MVC 不是一种技术,而是一种理念。
/** 模拟 Model, View, Controller */
var M = {}, V = {}, C = {};
/** Model 负责存放资料 */
M.data = "hello world";
/** View 负责将资料输出给用户 */
V.render = (M) => { alert(M.data); }
/** Controller 作为连接 M 和 V 的桥梁 */
C.handleOnload = () => { V.render(M); }
/** 在网页读取的时候呼叫 Controller */
window.onload = C.handleOnload;
在这个简短的程序中就是一个完整的 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绑死,没有弹性。
和其他的各种框架不一样,J2EE为模型对象(Model Objects)定义了一个规范。
Swing是一个标准的MVC结构。ComponentUI代表View,负责描画组件。组件尤其Model层,比如JTextField的Document、JTable的TableModel、JTree的TreeModel等等。Control可能不是很明显,我们可以将Event机制看作Swing团队为开发者设计的Controller。
作为Java开发者,如果想理解MVC的结构,学习Swing的确是个不错的选择。
在ASP.NET中,针对视图(View)和控制器(Controller)的模式没有被很好地定义。而模型(Model)则留给开发者去设计。
2013年10月17日ASP.NET MVC发表了稳定版本5.0。[3]
在ASP.NET MVC中,一般情况下Model通常搭配LINQ to SQL类别(使用O/R Designer工具所制作而成的DBML档)或ADO.NET实体资料模型(Entity Data Model,使用ADO.NET Entity Framework制作出的EDMX档)来实现。
随着.NET Core的发布,2016年5月17日发布了ASP.NET Core MVC 1.0.0-rc2。现已发展为ASP.NET Core MVC 6。
在WinForms中,这个针对视图(View)和控制器(Controller)的模式已经很好的定义。而模型(Model)则留给开发者去设计。
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语言所开发出来的 Web Framework,也是采用 Model-View-Controller 架构。Model 部分使用 Active Record 概念实做,加上 Migration 机制,使得其 Model 结构非常容易控制。
Python 有许多的 MVC 架构。最常用的有 Django 和 TurboGears。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.