摘 要
As a Javaer,I have used MVC pattern for a long time. Few days ago, I learned objective-c and developed an iOS application. There are many differences with backend Java web app. When using MVC pattern to seperate concerns, I felt that some inappropriate things was added into the view controller class. I found that they use MVVM frontend after some research。
MVC 是 Model-View-Controller 的简写。刚开始做项目的时候对 model 是什么一直没有搞明白,以为底层数据库表对应的实体是 model,这个理解在 .NET 开发中对某些语境里是正确的,但是却不全面。我们来看一下这个模式。
MVC 模式是在开发用户界面程序中使用的一种模式,用于将应用划分成三个互相有联系的部分。
Controller 是 view 与 model 交互的桥梁,担负着入口的责任。在 Spring 中,Controller 就是使用 @Controller
注解的类, 现在流行 restful,Controller 开始使用 @RestController
。
View 是视图,负责展现数据。在 Spring 中,有 JSP 页面,有 thymleaf 页面等等,基本是前端展示。
Model 是模型,是一种动态数据结构,用于管理程序的数据、逻辑以及规则,这句话是从 Wikipedia 翻译过来的,让人看了不知所云。其实 Model 就是 View 与 Controller 之间交互的数据结构,这个数据结构决定了应用能处理什么,逻辑是什么。
如果是一个小的应用程序,你与界面交互的数据结构直接是数据库表的实体,那么这个实体就是 Model,如果应用很复杂,加了 service 层和 dao 层,数据库实体隐藏在后面,那么 Model 就是你与前端页面约定好的交互数据结构。Model 是什么不重要,关键认清了 Model 的位置就不会迷惑了。
MVVM 模式是 Model-View-ViewModel 的简写。这里没有写 Controller,但这个模式里却是有 Controller 的。
为什么多了 ViewModel 这么一层呢?在原生应用开发上,也是有数据库的。从服务器传来的数据,需要先将其存放到本地,然后再展现到页面上。这里就涉及到了一个 view 与 model 的对应问题。由于前端除了展现之外还有一部分业务逻辑,因此由 Model 到 View 的过程中需要翻译。如果将其全部都放到 ViewController 中,那么 ViewController 就耦合了两个职责:一是业务逻辑的转换,二是支持View 和 Model 的连接(实际上在写代码过程中,很多人把视图的绘制也放到了 ViewController 中,这样就担负了三个职责)。在 SRP 原则下,ViewController 实际上只有连接这么一个职责,因此我们需要将这一业务逻辑的转换职责放到单独的类中来承担,也就是 ViewModel。
模式都是原则的体现。 MVC 模式和 MVVM 模式虽然叫法不一样,但实际上都是单一职责原则的变种。