众所周知MVC不是设计模式,是一个比设计模式更大一点的模式,称做设计模式不合理,应该说MVC它是一种软件开发架构模式,它包含了不少的设计模式,最为密切是如下三种:Observer (观察者模式), Composite(组合模式)和Strategy(策略模式)。因此说MVC模式又称复合模式。MVC(Model-View-Controller) 模式的基本思想是数据,显示和处理相分离。模型(Model)负责数据管理,视图(View)负责数据显示,控制器(Controller)负责业务逻辑和响应策略。数据库
从MVC的造成过程来看,最初只有模型和视图两个元素。模型封装了数据并提供操做接口,视图用来表现数据和接收用户请求。模型是独立的,而视图依赖于模型:从模型获取数据进行显示;向模型发送用户请求,并根据返回结果刷新本身。设计模式
须要用多个视图表现同一模型时,状况发生了变化:一个视图修改数据之后,不但自己要刷新,其余全部视图也要刷新。若是由该视图通知其余视图,它就须要知道其余全部视图,因为每一个视图均可能发出修改,每一个视图都要知道其余全部视图,这种关联过于复杂,不但难以维护,并且不便于增长新的视图。若是让模型通知全部视图更新,可能会影响模型的独立性。用观察者(Observer)模式 能够解决上述矛盾,从而实现:由模型通知视图,而模型不依赖于具体的视图,具体视图之间相互独立。浏览器
视图是用户请求的接收者,但不宜做为请求的处理者。由于界面是易变的,若是业务代码和界面代码放在一块儿,频繁的界面修改可能会破坏比较稳定的业务代码。将业务逻辑分离出来,由一个控制器负责,就是为了不这种干扰。服务器
模型在状态变化的时候,直接通知全部视图,视图向模型查询状态数据,而后刷新自身。当用户发出操做时,视图把消息发给控制器,控制器按照业务逻辑进行处理,须要查询或更新数据时,控制器会调用模型。
MVC架构把数据处理,程序输入输出控制及数据显示分离开来,而且描述了不一样部件的对象间的通讯方式。使得软件可维护性,可扩展性,灵活性以及封装性大大提升;MVC(Model-View-Controller)把系统的组成分解为M(模型)、 V(视图)、C(控制器)三种部件。视图表示数据在屏幕上的显示。控制器提供处理过程控制,它在模型和视图之间起链接做用。控制器自己不输出任何信息和作任何处理,它只负责把用户的请求转成针对Model的操做,和调用相应的视图来显示Model处理后的数据。架构
一样的数据,能够有不一样的显示和进行各类处理。显示仅仅是表现数据,而处理是根据用户请求改变数据的过程,不但包含业务逻辑,也要提供响应策略。响应策略由控制器负责,视图可使用不一样的控制器提供不一样的响应方式,这是策略(Strategy)模式的应用。框架
此外,MVC还容许视图嵌套,经过使用组合(Composite)模式,一致地处理组合视图和普通视图。工具
用多个视图表现一个模型,在视图不变的状况下改变响应策略,容许视图嵌套,这是MVC的三个主要特性。在内部结构上,MVC的主要关系是由观察者模式,策略模式和组合模式给出的。由观察者模式肯定的模型视图关系是其中最为重要的。布局
MVC 模式有许多变体。前述结构中,由模型通知视图刷新,称为主动MVC;若是由控制器更新模型之后通知视图,称为被动MVC结构。在许多应用中,没有明显的控制器角色,也没有视图嵌套。可见根据实际须要,构成MVC的三个模式上均可能出现变化。Web浏览器就是被动MVC结构的一个实例。
" 浏览器是一个交互程序,从概念上讲,它是由一组客户、一组解释器与一个管理它们的控制器所组成。控制器造成了浏览器的中心部件,它解释鼠标点击与键盘输入,而且调用其余组件来执行用户指定的操做。例如,当用户键入一个URL或者点击一个超文本引用时,控制器调用一个客户从所需文档所在的远程服务器上取回该文档,而且调用解释器向用户显示该文档。每一个浏览器必须包含一个HTML解释器来显示文档,其余解释器是可选的。HTML解释器的输入由符合HTML语法的文档所组成,输出由位于用户显示器上的格式版本文档所组成。解释器经过将HTML规则转换成适合用户显示硬件的命令来处理版面细节。HTML解释器一个最重要的功能是包含可选项。解释器必须存储关于显示器上位置之间关系的信息和HTML文档中被瞄定的项。当用户用鼠标选定了一个项,浏览器经过当前的光标位置和存储的位置信息来决定哪一个项被用户选定。"编码
用户界面逻辑的更改每每比业务逻辑频繁,尤为是在基于Web的应用程序中。例如,可能添加新的用户界面页,或者可能彻底打乱现有的页面布局。对显示的更改,尽量地不要影响到数据和业务逻辑。spa
目前大部分Web应用都是将数据代码和表示混在一块儿。经验比较丰富的开发者会将数据从表示层分离开来,但这一般不是很容易作到的,它须要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用须要一些额外的工做,但它带来的好处是无庸质疑的
最重要的一点是多个视图能共享一个模型,不管用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。因为已经将数据和业务规则从表示层分开,因此能够最大化的重用代码。
由于模型是自包含的,而且与控制器和视图相分离,因此很容易改变数据层和业务规则 [3]。例如,把数据库从MySQL移植到Oracle,或者把基于RDBMS数据源改变到LDAP,只需改变模型便可。一旦正确的实现了模型,无论数据来自哪里,视图都会正确的显示它们。MVC架构的运用,使得程序的三个部件相互对立,大大提升了程序的可维护性。
在开发过程当中,能够更好的分工,更好的协做。有利于开发出高质量的软件。良好的项 目架构设计,将减小编码工做量 :采用MVC结构 + 代码生成器,是大多数Web应用的理想选择。部分模型(Model)、和存储过程通常可用工具自动生成。控制(Controller)器比较稳定,通常因为架构师(也多是有经验的人)完成;那么整个项目须要手动编写代码的地方就只有视图(View)了。在这种模式下,我的能力不在特别重要,只要懂点语法基础的人均可以编写,不管项目成员写出什么样的代码,都在项目管理者的可控范围内。即便项目中途换人,也不会有太大问题。在我的能力良莠不齐的团队开发中,采用MVC开发是很是理想的。
MVC的优势体如今如下几个方面:
(1) 有利于团队开发分工协做和质量控制,下降开发成本。
(2) 能够为一个模型在运行时同时创建和使用多个视图。变化-传播机制能够确保全部相关的视图及时获得模型数据变化,从而使全部关联的视图和控制器作到行为同步。
(3) 视图与控制器的可接插性,容许更换视图和控制器对象,并且能够根据需求动态的打开或关闭、甚至在运行期间进行对象替换。
(4) 模型的可移植性。由于模型是独立于视图的,因此能够把一个模型独立地移植到新的平台工做。须要作的只是在新平台上对视图和控制器进行新的修改。
(5) 潜在的框架结构。能够基于此模型创建应用程序框架,不只仅是用在设计界面的设计中。
MVC的不足体如今如下几个方面:
(1)增长了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增长结构的复杂性,并可能产生过多的更新操做,下降运行效率。
(2)视图对模型数据的访问效率低。视图可能须要屡次调用Model才能得到足够的显示数据。
(3)彻底理解MVC并非很容易。使用MVC须要精心的计划,因为它的内部原理比较复杂,因此须要花费一些时间去思考。同时因为模型和视图要严格的分离,这样也给调试应用程序到来了必定的困难。
3.3 MVC 模式能够分解为如下设计模式
在GOF书的 Introduction中,有一小节是"Design Patterns in Smalltalk MVC"即介绍在MVC模式里用到的设计模式。它大概向咱们传达了这样的信息:合成模式+策略模式+观察者模式约等于MVC模式(固然MVC模式要多一些东西)。也就是说它在大部分状况下是下面几个模式:
(1)、观察者模式
(2)、合成模式
(3)、策略模式
4 谈谈MVC 架构模式中的三个角色
Mod封装的是数据源和全部基于对这些数据的操做。在一个组件中,Model每每表示组件的状态和操做这些状态的方法,每每是一系列的公开方法。经过这些公开方法,即可以取得模型端的全部功能。
在这些公开方法中,有些是取值方法,让系统其余部分能够获得模型端的内部状态参数,其余的改值方法则容许外部修改模型端的内部状态。模型端还必须有方法登记视图,以便在模型端的内部状态发生变化时,能够通知视图端。咱们能够本身定义一个Subject接口来提供登记和通知视图所需的接口或者继承 Java.util.Observable类,让父类完成这件事。
View封装的是对数据源Model的一种显示。一个模型能够由多个视图,而且能够在须要的时候动态地登记上所需的视图。而一个视图理论上也能够同不一样的模型关联起来。
在前言里提到了,MVC模式用到了合成模式,这是由于在视图端里,视图能够嵌套,好比说在一个JFrame组件里面,能够有菜单组件,不少按钮组件等。
封装的是外界做用于模型的操做。一般,这些操做会转发到模型上,并调用模型中相应的一个或者多个方法(这个方法就是前面在介绍模型的时候说的改值方法)。通常Controller在Model和View之间起到了沟通的做用,处理用户在View上的输入,并转发给Model来更改其状态值。这样 Model和View二者之间能够作到松散耦合,甚至能够彼此不知道对方,而由Controller链接起这两个部分。也在前言里提到,MVC用到了策略模式,这是由于View用一个特定的Controller的实例来实现一个特定的响应策略,更换不一样的Controller,能够改变View对用户输入的响应。
MVC (Model-View-Controller) : 模型利用"观察者"让控制器和视图能够随最新的状态改变而更新。另外一方面,视图和控制器则实现了"策略模式"。控制器是视图的行为; 视图内部使用"组合模"式来管理显示组件。
如下的MVC解释图很好的标示了这种模式: