大联大
直播中

汤玉荣

7年用户 183经验值
私信 关注
[经验]

MVC架构你知道多少

一、MVC 介绍MVC 是Model-View-Controller 的缩写,表示模型-视图-控制器的软件设计模式,最早由Xerox PARC 在二十世纪八十年代为编程语言Smalltalk 发明的一种软件设计模式。

MVC 被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。


二、MVC 目的MVC 的目的是实现一种动态的程序设计,通过一种业务逻辑、数据、界面显示分离的方法组织代码。

将业务逻辑聚集到一个部件里面,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能,达到在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。


三、MVC 内容使用 MVC 应用程序被分成三个核心部件:模型、视图、控制器。

    ● Model(模型):表示数据和业务规则。

    ● View(视图):显示数据,用户界面元素,例如文本,表单等。

    ● Controller(控制器):管理模型和视图中的通信



1. 控制器- Controller控制器主要是接收用户请求并响应用户,调用模型处理,将结果交给视图展示。

控制器本身并没有对获取的数据进行操作与预处理,也没有输出任何数据,只是根据用户的输入与需求(大多数情况由视图传递用户的请求),判断需要调用的模型,告知模型需要获取的数据或发生变化的数据,

由模型对数据进行处理。最后,由控制器响应用户,将数据传递给对象,由对像对结果进行展示。

控制器是视图获知模型数据变化及传递数据变化需求的管道。

2. 视图- View 视图的职责比较明确,负责渲染数据、 UI 界面,以及获知用户请求并传达给控制器。

视图需要正确的显示数据,然而本身并不负责存储所展示的数据进行存储(也不意味着视图决不存储数据),所以视图需要感知模型数据的变化。

因其所展示的数据都来自控制器,并且能够将用户请求和对数据的变更传递给控制器,可知视图与模型之前没有进行直接通信,视图与模型的通信都是以控制器为中介。

3. 模型- Model 模型封装了应用数据、应用流程和业务逻辑。

模型是 MVC 中逻辑最复杂,几乎应用的所有业务逻辑都需要在这里处理。模型封装了特定的应用数据,并且定义操作和处理该数据的逻辑和计算。

模型返回的数据需要保持中立,即模型的数据应该与数据格式无关,一个模型的数据能够供多个视图使用,但是模型应该与视图没有直接的连接,模型不会受视图的影响。

实际的应用中模型可能会分为数据访问层(DAO)和服务层(Service)。


四、MVC 的误解MVC 已经成为我们最常误用的模式,现在大部分流行的框架中都借鉴了Ruby on Rails 的ActiveRecord(AR) 概念,数据库中的每一个Table 都可以用AR 类来方便地进行增删改查操作,把AR 当做Model ,并推荐放在一个名为Model 的目录下。

于是,许多人在根据表设置对应的 AR 类后,便想当然的认为已经拥有 Model 层了,但其实 AR 只是DAO(数据访问层),并不是 Model 层。

实际上将领域相关业务放在AR 中,叫做“纯粹的领域模型”,纯粹的领域模型在小型应应用中或许看不出问题,但是在大系统中,却是要将业务抽像出来,封装各个领域的业务逻辑,能够具有强大的可维护性和可移植性,避免Model 过于臃肿,遵循重要的面向对象设计原则:接口隔离。

所以,需要设立一个独立的业务 Model 层,即所谓的 Service 。 AR ,所谓的 DAO ,实现存取逻辑、数据层次的缓存、数据切分等功能。 Service 实现逻辑、业务层次的缓存、领域对象的合并处理等等。

拥有了 Service 后,即使业务需求变更,只需要修改 Service 即可,甚至重设 Facade Service 。


五、ThinkPHP 的MVC从ThinkPHP 的文档中可以看到介绍, ThinkPHP 应用是基于MVC (模型-视图-控制器)的方式来组织。

一个 ThinkPHP 的应用一般会分为多个模块,每个模块都有自己独立的配置文件、公共文件和类库文件。每个模块是应用目录中的一个子目录,根据 MVC 的概念,目录下会划分为 Controller 、Model 、View 。

1. ThinkPHP 控制器ThinkPHP 的每个模块下面有多个控制器负责响应请求,而每个控制器其实就是一个独立的控制器类。

控制器主要负责请求的接收,并调用相关的模型处理,并最终通过视图输出。严格来说,控制器不应该过多的介入业务逻辑处理。

2. ThinkPHP 模型ThinkPHP 中模型类通常完成实际的业务逻辑和数据封装,并返回和格式无关的数据。

模型类并不一定要访问数据库,而且在 5.0 的架构设计中,只有进行实际的数据库查询操作的时候,才会进行数据库的连接,是真正的惰性连接。

ThinkPHP5.0 中支持模型层的多层设计,从而对模型层进行更细化的设计和分工,例如把模型层分为逻辑层/服务层/事件层等等。

3. ThinkPHP 视图ThinkPHP 中,控制器调用模型类后返回的数据通过视图组装成不同格式的输出。

视图根据不同的需求,来决定调用模板引擎进行内容解析后输出还是直接输出。

视图通常会有一系列的模板文件对应不同的控制器和操作方法,并且支持动态设置模板目录。


参考资料
   
    1. MVC 框架百度百科

    2. MVC架构的职责划分原则

    3. 什么是MVC 的领域模型

    4. Cocoa Core Competencies Apple 开发文档

    5. ThinkPHP5.0 完全开发手册


更多资讯,请关注大树云系列公众号:

更多回帖

发帖
×
20
完善资料,
赚取积分