MVC(温习深入)

MVC(Model-View-Controller,模型—视图—控制器模式)是软件工程中的一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。

MVC最早由Trygve Reenskaug在1974年[1]提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。模型—视图—控制器模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外此模式通过对复杂度的简化使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:

  • 控制器- 负责转发请求,对请求经行处理。
  • 视图 - 界面设计人员进行图形界面设计。
  • 模型 - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

目录

[隐藏]
  • 1 层次
  • 2 优点
  • 3 缺点及适用范围
  • 4 实现
    • 4.1 MFC
    • 4.2 Java
      • 4.2.1 Java 平台企业版 (J2EE)
      • 4.2.2 Java Swing
    • 4.3 .NET
      • 4.3.1 ASP.NET
      • 4.3.2 ASP.NET MVC
      • 4.3.3 Windows Forms
    • 4.4 Perl
    • 4.5 Ruby on Rails
    • 4.6 Python
    • 4.7 JavaScript
    • 4.8 PHP
    • 4.9 ActionScript 3
  • 5 参考资料
  • 6 外部链接

[编辑] 层次

模型(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

微软所推出的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

[编辑] Java 平台企业版 (J2EE)

和其他的各种框架不一样,J2EE为模型对象(Model Objects)定义了一个规范。

视图(View)
在J2EE应用程序中,视图(View)可能由Java Server Page(JSP)承担。生成视图的代码则可能是一个servlet的一部分,特别是在客户端服务端交互的时候。
控制器(Controller)
J2EE应用中,控制器可能是一个servlet,现在一般用Struts实现。
模型(Model)
模型则是由一个实体Bean来实现。

[编辑] Java Swing

[编辑] .NET

[编辑] 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

  • Model-View-Controller (MVC) with JavaScript

[编辑] PHP

  • The Model View Controller Framework for PHP Web Applications

[编辑] ActionScript 3

  • PureMVC Standard for 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-cn/MVC”

转载于:https://www.cnblogs.com/cuihongyu3503319/archive/2009/11/12/1601548.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试官问:能否模拟实现JS的new操作符(高频考点)

可以点击上方的话题JS基础系列,查看往期文章这篇文章写于2018年11月05日,new模拟实现,Object.create是面试高频考点,之前发布在掘金有近2万人阅读,现在发布到公众号声明原创。1. 前言这是面试官问系列的第一篇&#xf…

Linux环境下设置IPDNSGateway

转载链接:http://www.myhack58.com/Article/sort099/sort0102/2011/29291.htm 在Linux中不管你是做服务器还是只是平常使用,上网肯定都是最重要和不可缺少的一个因素之一,所以就涉及到它的ip gateway dns等network配置和使用。但是设置Linux…

跟我一起学WCF(2)——利用.NET Remoting技术开发分布式应用

一、引言 上一篇博文分享了消息队列(MSMQ)技术来实现分布式应用,在这篇博文继续分享下.NET平台下另一种分布式技术——.NET Remoting。 二、.NET Remoting 介绍 2.1 .NET Remoting简介 .NET REmoting与MSMQ不同,它不支持离线可得&…

二叉树的建立与遍历_51、二叉树遍历-重建二叉树JZ4

题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路回顾三种经典的遍历&…

越来越觉得现在的工作很枯燥

很不想这么说,但又不想欺骗自己,真的是很枯燥,不过这种感觉早在一年在在上一间公司时就很强烈的有过这种感觉了,只不过现在是又一次有感触罢了。话说说我这种性质的工作枯燥很多人都讲过,如果哪个人说不枯燥估计脑袋进…

推荐关注这7个高质量的前端公众号

拓宽眼界,增加深度,在阅读的世界里,我们往往能找到不一样的态度,提升朋友圈质量,从关注这几个公众号开始。轻扫一下二维码就行了,你可以试试,肯定会有意外收获。大迁世界 简介:前端小…

MySQL 实用语句集合

MySQL 实用语句集合 参考链接[用户]:http://blog.csdn.net/dmtnewtons_blog/article/details/9136339 参考链接[属性]:http://stackoverflow.com/questions/15821532/get-current-auto-increment-value-for-any-table 参考链接[索引]:htt…

python对象序列化或持久化的方法

http://blog.csdn.net/chen_lovelotus/article/details/7233293 一、Python对象持久化方法 目前为止,据我所知,在python中对象持久化有以下几种方法: 1. 使用(dbhash/bsddb, dbm, gdbm, dumbdbm 等)以及它们的"管理器"(…

Windows Live Writer 在win2003 的安装方法

下载Windows Live Writer整体安装包,最好是离线安装包 2.在xp系统上安装 3.查找C:\Program Files\Common Files\Windows Live\.cache目录 .cache目录是隐藏的,目录下面就是各个安装文件的msi安装包 4.拷贝相应的msi文件,到Windows 2003安装就…

decode 大于比较 小于_6 燃气输配系统6.3 压力不大于1.6Mpa的室外燃气管道城镇燃气设计规范 GB500282006(2020修订版)...

6.3 压力不大于1.6Mpa的室外燃气管道6.3.1中压和低压燃气管道宜采用聚乙烯管、机械接口球墨铸铁管、钢管或钢骨架聚乙烯塑料复合管,并应符合下列要求: 1 聚乙烯燃气管应符合现行的国家标准《燃气用埋地聚乙烯管材》GB15558.1 和《燃气用埋地聚乙烯管件…

若川的2017年度总结,一如既往

可以点击上方的标签若川的故事、年度总结,查看往期文章有读者反馈说看我年度总结系列比我源码系列更有启发。所以打算把2016-2018的年度总结发布到公众号声明原创,希望对大家有所启发。(虽然我的每一年都过得非常普通...)若川的20…

MIME协议及源邮件格式分析

转载链接:http://wenku.baidu.com/view/7246de671ed9ad51f01df277.html 电子邮件也许是一个Internet上的流行最广泛的应用。也是我们现在的大多数网络办公流程的基础。各种邮件服务器很多,但都大都遵循以1982年出版的RFC822--《ARPA网络文本信息格式标准(STANDARD F…

沟通:用故事产生共鸣

《沟通:用故事产生共鸣》(全彩) 基本信息作者: Nancy Duarte(南希.杜瓦特)译者: 冯海洋出版社:电子工业出版社ISBN:9787121195914上架时间:2013-4-1出版日期:2013 年3月开本:12开页码&#xff1…

合工大五套卷_2020合工大超越数一五套卷第一套感想

合工大的卷子确实不错,题目给我的感觉是题干包装的看起来就很难,但是写起来还是一样的套路。计算上要难一些,需要细心点选择题:1.可去间断点的定义和泰勒公式2.这个题我用排除法写的,可微的话连续和偏导存在都成立了,然…

DotNet关键知识点——WPF篇(一)(范德成编辑批注版)

1. Journal 的使用 Journal 用于在 XAML 浏览器应用程序(XBAP)中维护历史访问页。删除前一访问页只需调当前 NavigationService 对象的 RemoveBackEntry() 即可;而增加一个访问页则复杂得多: 1) 实现一个 CustomContentState 的派…

若川的2018年度总结,平淡无奇

可以点击上方的标签若川的故事、年度总结,查看往期文章偷偷告诉你,公众号内回复【报告】,可以获取你自己的github 2020 年度报告昨晚在我的6个微信群里都发了红包,以这样的方式跨过了2020年。运营公众号真的挺难的,比如…

Simple TCP Server Client Socket C

转载链接&#xff1a;http://blog.163.com/caipeipei_love126/blog/static/2596603220101118433940/ tcpserver.c #include<stdlib.h> #include<stdio.h> #include<errno.h> #include<string.h> #include<netdb.h> #include<sys/types.h>…

基于dnn的车牌识别_自然场景中文文字识别,身份证火车票都能识别

图像处理中OCR(Optical Character Recognition光学字符识别)场景非常多&#xff0c;也给大家的工作生活带来了很多便利&#xff0c;比如车牌识别就能管理停车场车辆的出入&#xff0c;快递时只需给一个带有快递信息的图就能自动解析上传发件信息和收件信息&#xff0c;再比如我…

年末的大厂前端面试总结(20届双非二本)-终入字节

关注若川视野, 回复"pdf" 领取资料&#xff0c;回复"1"&#xff0c;可加群长期交流学习自我介绍双非二本,软件工程,自学前端,今年毕业。喜欢编程,古风,日语和英语。常以冷月心之名混迹前端江湖,也曾在混迹网文圈时用冷月心做笔名签约掌阅,作品《清起风云》…