zoukankan      html  css  js  c++  java
  • MVC 架构模式


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


    什么是 MVC?

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

    • View(视图)

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

    • Controller(控制器)

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

    • Model(模型)

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


    为什么使用 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 不适合用于小型、中型应用程序。

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

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

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

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


  • 相关阅读:
    Zabbix实现企业微信(WeChat)告警
    Zabbix使用腾讯企业邮箱发送警报邮件,在微信查看警报邮件
    centos7安装pip
    zabbix源码安装3.4.11客户端和yum安装4.2.1客户端
    zabbix中文乱码解决
    centos7配置阿里yum源替换centos自带的yum源(其他镜像yum源配置相似)
    CentOS7.5下Redis5.0.5安装与配置
    LVS+Keepalived搭建高可用负载均衡
    centos7配置双ip(内外网均可访问)
    NSMutableAttributedString 的使用
  • 原文地址:https://www.cnblogs.com/Yee-Q/p/13706921.html
Copyright © 2011-2022 走看看