传统MVC模式
对于大部分面向最终用户的应用来说,它们都需要具有一个可视化的UI界面与用户进行交互,我们将这个UI称为视图(View)。在早期,我们倾向于将所有与UI相关的操作糅合在一起,这些操作包括UI界面的呈现、用于交互操作的捕捉与响应、业务流程的执行以及对数据的存取,我们将这种设计模式称为自治视图(Autonomous View,AV)。
自治视图
说到自治视图,很多人会感到陌生,但是我们(尤其是.NET开发人员)可能经常在采用这种模式来设计我们的应用。Windows Forms和ASP.NET Web Forms虽然分别属于GUI和Web开发框架,但是它们都采用了事件驱动的开发方式,所有与UI相关的逻辑都可以定义在针对视图(Windows Forms或者Web Forms)的后台代码(Code Behind)中,并最终注册到视图本身或者视图元素(控件)的相应事件上。
一个典型的人机交互应用具有三个主要的关注点,即数据在可视化界面上的呈现、UI处理逻辑(用于处理用户交互式操作的逻辑)和业务逻辑。自治视图模式将三者混合在一起,势必会带来如下一些问题:
业务逻辑是与UI无关的,应该最大限度地被重用。由于业务逻辑定义在自治视图中,相当于完全与视图本身绑定在一起,如果我们能够将UI的行为抽象出来,基于抽象化UI的处理逻辑也是可以被共享的。但是定义在自治视图中的UI处理逻辑完全丧失了重用的可能。
业务逻辑具有最强的稳定性,UI处理逻辑次之,而可视化界面上的呈现最差(比如我们经常会为了更好地呈现效果来调整HTML)。如果将具有不同稳定性的元素融为一体,那么具有最差稳定性的元素决定了整体的稳定性,这是“短板理论”在软件设计中的体现。
任何涉及UI的组件都不易测试。UI是呈现给人看的,并且用于与人进行交互,用机器来模拟活生生的人来对组件实施自动化测试不是一件容易的事,自治视图严重损害了组件的可测试性。
为了解决自治视图导致的这些问题,我们需要采用关注点分离(Seperation of Concerns,SoC)的方针将可视化界面呈现、UI处理逻辑和业务逻辑三者分离出来,并且采用合理的交互方式将它们之间的依赖降到最低。将三者“分而治之”,自然也使UI逻辑和业务逻辑变得更容易测试,测试驱动设计与开发变成了可能。这里用于进行关注点分离的模式就是MVC。
什么是MVC模式
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还可以表示成进行服务调用的代理。
本文节选自《ASP.NET MVC 4 框架揭秘》
蒋金楠 著
电子工业出版社出版
相关推荐
MVC 模式在 Web 应用中的实现 MVC 模式是一种常用的设计模式,在 Web 应用开发中...本文提出的新的 MVC 模式实现方式可以有效地解决传统 MVC 模式实现方式的不足之处,同时也易于传统 GUI 应用开发人员掌握和使用。
采用传统的MVC设计模式,mysql数据库脚本,代码可以直接使用,脚本直接导入mysql数据库,不能保证不出bug,可以给刚刚入门j2EE的人看看(好像这个是最开始的版本,原谅笔者在这之前框架不熟的原因,所以没有采用任何...
### 传统MVC架构与前后端分离架构对比 #### 一、引言 在软件开发领域,架构设计的选择对于项目的成功至关重要。其中,MVC(Model-View-Controller)架构和前后端分离架构是最常见的两种架构模式。这两种模式各有...
为了克服传统MVC模式中的双向依赖问题,可以引入观察者模式(Observer Pattern)来优化MVC模式。观察者模式允许一个对象(Subject,即被观察者)维护一个观察者列表,并在状态发生变化时通知所有观察者,从而实现...
- **前端框架的兴起**:随着React、Vue等前端框架的出现,客户端的MVC模式(有时称为MVVM模式)也变得越来越流行,这进一步改变了传统MVC模式的应用场景。 #### 五、结论 MVC设计模式作为一种经典的架构模式,在...
4. 不利于前后端分离:传统MVC模式对前端开发不够友好,随着现代Web应用的发展,MVVM(Model-View-ViewModel)等模式更适合前后端分离的开发方式。 结合"framework.txt"文件,我们可以分析其中可能包含的PHP框架...
ExtJS的MVC模式是其框架的核心特性之一,主要用于组织和管理复杂的用户界面代码,确保应用的可维护性和可扩展性。在深入讲解MVC模式之前,先了解一下ExtJS本身。ExtJS是一款基于JavaScript的开源UI库,它提供了一套...
### J2EE中的MVC模式解析 #### 一、MVC模式概述 MVC(Model-View-Controller)模式是一种广泛应用于软件工程的设计模式,尤其在Web应用开发中被广泛应用。这种模式的主要目的是将应用程序的不同关注点进行分离,...
传统MVC模式的实现逻辑通常是这样:用户首先与视图进行交互,视图将用户的操作通过控制器传递给模型,模型根据业务逻辑处理数据,并且可能通知视图进行更新。在这种模式下,视图和模型之间不直接通信,它们通过控制...
Struts2的出现,是对传统MVC模式的一种完善和补充,它在灵活性、拦截器、数据传输、访问性和错误处理方面都有较大的改进。然而,随着新的技术如Spring MVC的出现,Struts2逐渐被许多开发者认为是过时的技术,因为它...
**MVC模式与ASP.NET MVC框架概述** MVC(Model-View-Controller)模式是一种广泛应用于Web开发的设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于实现...
5. **支持多种数据源**:除了传统的关系型数据库外,MVC模式还可以支持NoSQL数据库、云服务等多种类型的数据源。 6. **提高开发效率**:通过复用现有的模型、视图和控制器组件,可以大大减少重复工作量,从而提高...
在Delphi中应用MVC模式的必要性在于它能够解决传统模式中代码复用和维护的挑战。MVC模式的引入有助于将界面和逻辑分离,从而提高代码的可维护性和可扩展性。在此模式下,业务逻辑的变更只需要在模型层进行修改,视...
传统的三层开发体系结构包括表示层、业务逻辑层和数据访问层,这与MVC模式在一定程度上有相似之处。不同之处在于,MVC模式更加强调视图与模型之间的分离,以及控制器的作用。 ##### 3.5 常见的MVC模式实践 - **...
基于Spring框架的MVC模式实现机制是对传统MVC模式的一种扩展,其核心优势在于Spring框架提供的轻量级、高内聚低耦合的组件结构,允许开发者构建高效、灵活且易于使用的Web应用程序。Spring框架结合了JSP技术作为视...
与传统的Web Forms模式不同,MVC模式将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。在不破坏这一结构的同时,在MVC模式下集成水晶报表需要一个更巧妙的方法。 建立自己的水晶...
**MVC模式与ASP.NET MVC框架概述** **一、MVC设计模式** MVC(Model-View-Controller)设计模式是一种软件架构模式,广泛应用于Web应用程序开发中,它将应用程序分为三个主要组件:模型(Model)、视图(View)和...
基于MVC模式下的开发框架建设与改进.pdf论文中主要介绍了基于MVC模式下的开发框架建设与改进,讨论了传统的PHP开发模式的缺陷,并提出了基于MVC设计模式的PHP实现THINKPHP框架的建设和改进。 知识点1:MVC设计模式 ...
### MVC模式详解 #### 一、MVC模式概述 MVC模式(Model-View-Controller)是一种广泛应用于软件工程中的设计模式,特别是在Web应用程序开发领域。这种模式将应用程序分为三个核心部分:模型(Model)、视图(View...