分享

深入理解MVC

 算法与编程之美 2020-08-08

1 问题描述

最近在学习springMVC,大家应该都知道该框架是基于MVC架构的框架,我们平时也常说MVC架构,MVC模式等等。都觉得MVC非常的神秘,我们平时都在使用MVC,但却鲜有人知其所以然,那究竟什么是MVC呢?我们今天就来揭开MVC的神秘面纱。

2 问题分析

MVC定义:全名Model View Controller,MVC即模型(model)-视图(view)-控制器(controller)的缩写。

首先我们先了解一下这三者的概念:

Model(模型):

数据模型,提供要展示的数据,因此包含数据和行为,可以理解为JavaBean组件(包含数据和行为),不过现在一般都分离开来:数据层和服务层(行为)。也就是model提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。

View(视图):

负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。

Controller(控制器):

接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。因此我们可以把控制器理解为一个调度员。

使用MVC的目的:

MVC要实现的目标是将软件用户界面与业务逻辑分离,从而使同一个程序可以使用不同的表现形式。使得代码可扩展性、可复用性、可维护性、灵活性加强。View层是界面,Model层是业务逻辑,Controller这位调度员用来调度View层和Model层,将用户界面与业务逻辑合理的组织在一起,起粘合剂的效果。

例如,有一个View会提交数据给Model进行处理以实现具体的行为,View通常不会直接提交数据给Model,它会先把数据提交给Controller,然后Controller再将数据转发给Model。假如此时业务逻辑的处理方式有变化,那么只需要在Controller中将原来定的Model换成新实现的Model就可以了,这就是控制的作用,用来将不同的View和不同的Model组织在一起,顺便替双方传递消息。

3 MVC究竟是什么

说了这么多,我们已经知道了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的变化,以至于造成混乱。所以切忌,避免这种情况。

4 总结

经过分析我们已经揭开了MVC的神秘面纱,我们分析了MVC的各个模块的含义与作用,并且根据一个经典MVC案例讲解了其流程。我们明白MVC存在的主要作用就是解耦,提高代码的复用性,并简要说明了其用到的三个设计模式,只要将这三个设计模式弄明白,MVC将毫无神秘感而言。我们在实际开发中几乎都在利用MVC这种方式进行开发,所以知其然并知其所以然是很有必要的。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多