MVC 架构模式

2年前 (2022) 程序员胖胖胖虎阿
219 0 0

面试的时候被问到有关 MVC 的问题,虽然这块知识点并不难,但还是总结一下,下次再遇到的话,争取能做到侃侃而谈,而不是简简单单把概念给复述一遍。

什么是 MVC?

MVC 模型代表 Model - View - Controller,即模型 - 视图 - 控制器模式,从上到下依次介绍:

  • View(视图)

    简单来说,就是负责数据的可视化。

  • Controller(控制器)

    通常控制器用来从视图读取数据,并发送给对应的模型处理,再将结果反馈给视图显示。充当视图与模型之间数据交互的桥梁。

  • Model(模型)

    模型是用于处理应用程序中业务数据和逻辑的部分,负责直接与数据库打交道。

MVC 架构模式

为什么使用 MVC?

MVC 属于架构模式的一种,所谓架构就是如何设计一个程序的结构。MVC 将程序结构划分为三层,每一层都对外提供了可供上层调用的接口,既能维系三层之间的联系,也能保持相对的独立性。

而每一层都有各自的职责,我们可以将同一逻辑的代码聚集到一个组件,再放到对应的层次中。视图层作个性化的定制页面,而无需知晓下层业务的具体实现。同样的,控制层专心协调视图与模型的数据交互,模型层处理业务逻辑,无需关心数据该如何显示。

这种将业务逻辑、数据和界面分离的代码组织形式,降低了模块间的耦合度,有利于日后的维护与扩展。

MVC 的理解误区

先说控制层,为什么要把控制层单独拎出来说呢?因为很多人都误解了 MVC 的真正含义,他们只是把简单地把程序划分为三层设计,并没有理解到 MVC 的内涵。

前面已经说了,控制层只是负载协调视图层与模型层的数据交互,就像一个粘合剂,把视图层和模型层联系起来,除此之外再无其他。而有的程序员却喜欢在控制层写大量的业务处理代码,这是十分不合适的。

如果这样做了,那 MVC 的优势不就被你自己亲手扼杀了吗?MVC 的核心思想是 Controller 可以自由调用 Model,Model 之间的互相调用亦是如此,这是 MVC 的精髓所在。而 Controller 之间是不可以互相调用的,试问此时你要如何复用 Controller 中的业务代码呢?

所以说各司其职很重要,不要胡乱指派任务,否则就是在给自己挖坑。

另外,很多人都知道 Controller - Service - Dao 三层架构,其中 Controller 和 Service 我们可以认为就是 MVC 中的控制层和模型层。而 Dao 其实不属于 MVC,Dao 封装了访问数据访问的代码,Service 则去调用 Dao 提供的接口来处理数据,仅此而已。

MVC 的优点

  • 耦合性低

    视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动 MVC 的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

  • 重用性高

    一个模型能被多个视图共享,这意味着从模型传回来的数据能以多种方式显示,而不需要为每一种显示方式编写特定的代码,大大减少了代码量。

  • 部署快

    使用 MVC 模式使开发时间得到相当大的缩减,后台程序员集中精力于业务逻辑,前端程序员集中精力于表现形式上。

  • 可维护性高

    分离视图层和业务逻辑层也使得 WEB 应用更易于维护和修改。

  • 有利软件工程化管理

    由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。

MVC 的缺点

  • 增加系统结构和实现的复杂性

    对于简单的界面,严格遵循 MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。所以说 MVC 不适合用于小型、中型应用程序。

  • 视图与控制器间的过于紧密的连接

    视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。

  • 视图对模型数据的低效率访问

    依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

版权声明:程序员胖胖胖虎阿 发表于 2022年9月9日 上午3:48。
转载请注明:MVC 架构模式 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...