MVC设计模式详解(思想、机构、作用与实现)

MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而得到更好的开发和维护效率。

MVC设计模式详解(思想、机构、作用与实现)

所属分类: 理念
专题标签: MVC 设计模式 解耦

MVC简介

MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。
MVC是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
MVC始存于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器。
MVC设计在Java Web应用中得到广泛的应用,但其并不局限于Java语言,比如前端、PHP、.NET 等语言。
之所以采用MVC设计模式的根本原因在于解耦各个模块。

MVC设计思想

MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层:模型层、视图层、控制层。
MVC三个层面的职责非常明确,而且相互分离,因此每个层面都可以独立的改变而不影响其他部分,从而大大提高了应用的灵活性和重用性。

模型(Model)

模型(Model)通常又分为数据模型和业务逻辑模型。

  1. 数据模型用来存放业务数据,比如订单信息、用户信息等;
  2. 业务逻辑模型包含应用的业务操作,比如订单的添加或者修改等。

因此:Model主要用于存储数据以及处理用户请求的业务逻辑。

视图(View)

视图(View)代表模型(Model)包含的数据的可视化,将内容展现给用户。

  • 视图从模型获得要展示的数据,然后用自己的方式展现给用户,相当于提供界面来与用户进行人机交互,比如由html元素组成的网页界面,或者软件的客户端界面。
  • 一般来说,模型发生改变时会通知视图,视图也可以主动向模型(经过控制器)查询变化来保证数据一致性。
  • 当用户在视图(View)界面上操作后,如提交、触发事件等,将向控制器(Controller)发出请求。

控制器(Controller)

控制器(Controller)控制数据流向模型对象,并在数据变化时更新视图。
控制器(Controller)作用于模型和视图上,本身并不做任何处理,它使得视图与模型解耦分离。

  1. 收到用户的请求后,会将请求与模型的更新相映射,调用模型来实现用户请求的功能。
  2. 选择用于响应的视图,将模型更新后的数据展示给用户。

MVC的作用

当程序结构划分不明确时,各个部分功能混乱,如果需要变更业务功能时,无论是业务逻辑修改还是显示形式修改,都要修改很多的关联类,“牵一发而动全身”,导致软件的开发和维护效率低下,BUG百出。
遵循MVC模式来开发系统,就会极大的避免上述问题的出现。
MVC模式的核心手段是解耦,MVC模式通过科学的层次划分,把整个应用程序划分成模型、视图、控制器三个部分,然后严密控制三个部分之间的通信,从而得到一个结构清晰、功能分布合理、可重用、可扩展、可维护的应用程序。

MVC的好处

  1. 低耦合:
    MVC模式,模型和视图是解耦的,模型不会依赖于视图,而视图也仅仅是从模型中获取需要展示的数据,并不会与模型的逻辑处理相关联。
  2. 低成本:
    MVC模式帮我们清楚的划分了职责,可以让程序员各司其职,服务端只关心业务逻辑的实现,也就是模型部分;UI程序员只关心页面展示,也就是视图部分即可。
  3. 可维护:
    MVC模式划分出明晰的模型和视图部分,并使其解耦,在软件需求发生变更的时候,就可以各自独立的改变而不会相互影响,使得程序更容易维护和扩展。

MVC在Web应用中的实现(Model2模型)

采用MVC设计模式并不一定完全生搬硬套。
比如在Java的Web开发中,通常把Servlet+JSP+JavaBean的模型称为Model2模型,这是一个完全遵循MVC模式的模型。
经典框架Struts2、SpringMVC均遵循了这个模型进行设计。

  • JavaBean(模型){数据模型:实体类;逻辑模型:Service层、Dao层等}
  • JSP(视图)
  • Servlet(控制){原生Servlet、SpringMVC的Controller、Struts2的Action等}

在Web开发中,由于Web应用程序的性质,不存在服务器主动向客户端“推”数据(这里代指TCP协议下),因此从Model到View之间的虚线是不存在的。

效果如下图: