最近在学习springMVC,你们应该都知道该框架是基于MVC架构的框架,咱们平时也常说MVC架构,MVC模式等等。都以为MVC很是的神秘,咱们平时都在使用MVC,但却鲜有人知其因此然,那究竟什么是MVC呢?咱们今天就来揭开MVC的神秘面纱。java
MVC定义:全名Model View Controller,MVC即模型(model)-视图(view)-控制器(controller)的缩写。web
首先咱们先了解一下这三者的概念:spring
Model(模型):编程
数据模型,提供要展现的数据,所以包含数据和行为,能够理解为JavaBean组件(包含数据和行为),不过如今通常都分离开来:数据层和服务层(行为)。也就是model提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。设计模式
View(视图):浏览器
负责进行模型的展现,通常就是咱们见到的用户界面,客户想看到的东西。服务器
Controller(控制器):架构
接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展现。所以咱们能够把控制器理解为一个调度员。框架
使用MVC的目的:ide
MVC要实现的目标是将软件用户界面与业务逻辑分离,从而使同一个程序可使用不一样的表现形式。使得代码可扩展性、可复用性、可维护性、灵活性增强。View层是界面,Model层是业务逻辑,Controller这位调度员用来调度View层和Model层,将用户界面与业务逻辑合理的组织在一块儿,起粘合剂的效果。
例如,有一个View会提交数据给Model进行处理以实现具体的行为,View一般不会直接提交数据给Model,它会先把数据提交给Controller,而后Controller再将数据转发给Model。假如此时业务逻辑的处理方式有变化,那么只须要在Controller中将原来定的Model换成新实现的Model就能够了,这就是控制的做用,用来将不一样的View和不一样的Model组织在一块儿,顺便替双方传递消息。
说了这么多,咱们已经知道了MVC(Model-View-Controller)三个单词的含义与做用,那MVC到底是什么呢?它是一种编程技术吗?不是的,MVC是一种设计思想。用于指导开发者将数据也表现解耦,提升代码,特别是模型部分代码的复用性。若是咱们将MVC理解为“外观”、“机制”和“功能/数据”这三层结构,那么咱们生活中不少地方均可以经过MVC进行架构。
好比一家商场,彻底能够分为三部分,一部分是仓库,负责提供农商品,这是“功能层”或者“数据层”;另外一部分是零售店铺,负责销售商品,这是他的“外观层”;它们二者之间就是“机制层”,包括柜台和仓库之间一切互动的机制。这样区分事后,这个商场的就够就变得很是清楚,能够针对不一样的层进行优化,提升效率。
而在咱们的实际开发中,最典型的MVC架构是Jsp+Servlet+JavaBean的模式。
请看图3-1:
图3-1 Jsp+Servlet+JavaBean中的MVC
如图中所示,实际上在Jsp+Servlet+JavaBean的开发中,Servlet就是控制器(Controller)的角色,Jsp就是视图(View),而JavaBean就是模型(Model)。三者之间紧密配合造成了一个闭环。当从浏览器发起一个请求事后,首先servlet会接收此请求,而后将用户输入的指令和数据传递给相应的JavaBean来处理业务逻辑,再根据业务逻辑选择不一样的Jsp页面显示即视图,最终由浏览器显示视图。而View会随时对Model中的数据进行状态查询,若是model中数据有了改变,那么model将会通知view进行视图改变。这就是咱们实际开发中最典型的MVC架构模型。
通过咱们上面的分析,有人可能会问了,MVC是一种设计模式吗?在GoF所著的《设计模式》一书中总结出了java编程中23种设计模式,然而23种设计模式中并无MVC这个设计模式。其实确切的说MVC不只仅是一个单独的设计模式,它是多个设计模式的组合。组成MVC的三个模式分别是组合模式、策略模式、观察者模式,MVC的强大,是离不开这三个设计模式的默契配合。那MVC中到底哪里用到了这三个设计模式呢?咱们分别来看。
先说组合模式,组合模式只在视图层活动,其实视图层实现用的就是组合模式。组合模式的类层次结构是树状的,而咱们作web页面时写的HTML代码结构不就是树状的吗,这就是一个组合模式的应用。在平时页面的渲染都是由浏览器帮咱们完成了,因此咱们几乎感觉不到其存在。
再一个是观察者模式,观察者模式分为两部分,被观察的对象和观察者,观察者又称为监听者。对应到MVC中,Model就是被观察的对象,View是观察者,Model层一旦发生变化,View即被通知更新。View层和Model层互相之间是持有引用的。咱们在开发Web MVC程序时,由于视图层的HTML和Model层的业务逻辑之间隔了一个HTTP,因此不能显示的进行关联,可是他们观察者和收听者的关系没有改变。当View经过HTTP提交数据给服务器,服务器上的Model接受到数据执行某些操做,再经过HTTP响应将结果返回给View,浏览器接受到数据并更新界面,这是观察者模式的另外一宗表现形式。
最后是策略模式。策略模式是View和Controller之间的关系,Controller是View的一个策略。怎么理解这句话呢?想一下咱们实际开发中,咱们一个View有可能会被多个Controller给引用,也就是说Controller对于View是可替换的,View和Controller的关系是一对多。这就是策略模式的一种体现。
总结一下关于MVC各层之间关系所对应的设计模式:
View层:单独实现组合模式
Model层和View层:实现了观察者模式
View层和Controller层:实现了策略模式。
在这补充讨论一点,平时开发中有许多人喜欢将业务逻辑放在controller层,从设计模式的角度讲,策略模式中的策略一般都很小很薄,不会包含太多内容,Controller既然是一个策略,那天然不能在里面放太多的内容,不然替换一个新的会至关麻烦,于此同时会破坏View-Model的观察者模式,使得View不能快捷的观察到Model的变化,以致于形成混乱。因此切忌,避免这种状况。
通过分析咱们已经揭开了MVC的神秘面纱,咱们分析了MVC的各个模块的含义与做用,而且根据一个经典MVC案例讲解了其流程。咱们明白MVC存在的主要做用就是解耦,提升代码的复用性,并简要说明了其用到的三个设计模式,只要将这三个设计模式弄明白,MVC将毫无神秘感而言。咱们在实际开发中几乎都在利用MVC这种方式进行开发,因此知其然并知其因此然是颇有必要的。
更多精彩文章: