我眼中的MVC模式

无论是早期使用MFC编写的Windows软件,还是现在的各种应用程序(iOS APP,Android APP,微信小程序…)无论是网络应用程序,还是用Qt编写的跨平台程序,他们无一例外地使用到了MVC(Model-View-Controller)的编程思想。个人认为编程一旦涉及到GUI界面,都会用到这个思想。因此,无论学习哪一种应用编程,学习之前研究一下MVC模式是非常必要的,它能让你的学习工作事半功倍。提示一下,学习MVC模式之前需要对面向对象的编程模式有一定的了解。


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

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

我眼中的MVC模式


现在,分享一下个人理解,若有讲不对或者不好的地方,还望大牛指点:
首先我讲讲我对模型,视图和控制器的理解。

  • 模型(Model):我认为是一个GUI程序最终要操作的东西,可以把它抽象成一个类(一堆数据参数与函数的集合)。它可以是数据库的一张表,也可以是一个具体设备,例如摄像头。

  • 视图 (View):就是用户可以在电脑屏幕上看到的东西,即应用程序的界面,与用户交互用的。它一般是一些窗口与控件的堆叠,但是还未实现功能。

  • 控制器(Controller):为了让GUI程序真正运行起来,那么就需要建立模型与视图的联系,这种联系打比方说,就是数据库某个表中的数据的更新会在视图的某个文本框中实时更新,或者说是视图中某个按键的点击,可以触发摄像头拍一张照片。而这两者之间的这些逻辑关系正是控制器的职责所在,它可以有条不紊地打通起模型和数据之间的联系通道。

以我个人的理解,感觉*上MVC 与用户之间的交互的那张图片解释的不是很清晰。个人比较倾向于用下面这张图片表示它们四者之间的关系:

我眼中的MVC模式

  • 用户主要通过视图(View)进行直接交互
  • 用户对视图(View)的操作会触发控制器(Controller)对模型 (Model)进行直接操作
  • 模型(Model)的数据发生变化,会通知控制器(Controller)对视图(View)进行更新
  • 在有些情况下,用户也会能够与模型(Model)进行交互,比方摄像头是模型的话,那么用户这时候就可以操作模型。

MVC模式的优点:

  • 视图,控制器和模型 这三者的分离的模式,可以让代码的编写,管理和维护变得清晰明了。很多做过GUI编程的程序员应该或多或少能发现,如果不使用这种模式的话,随着软件功能的不断完善,代码会乱到自己都看不懂。
  • 这种模式,让GUI程序设计比较灵活,具有可扩展性和复用性。还是以摄像头为模型这个例子来说,若突然需求变化,需要更换了摄像头型号的话,这种MVC模式的程序只需要修改少量的代码,就可以继续使用了。
  • 这种模式,实现了界面设计与后台逻辑设计的分离,这在网站设计中体现得尤为明显,让不同类型的程序员可以高效有序地合作开发一款产品。

Note: 解释了很多,估计还是有点抽象,在以后的文章中,会以不同的具体GUI编程框架为例,跟大家一起研究并讲解它们的设计中体现出来的MVC思想。