由于最近在某厂实习,接触到了这个玩意,所以了解一哈~
1、MVC框架简介
模型-视图-控制器 (MVC) 设计模式为应用程序中的对象分配三个角色之一:模型、视图或控制器。该模式不仅定义了对象在应用程序中扮演的角色,还定义了对象相互通信的方式。这三种类型的对象中的每一种都通过抽象边界与其他对象分开,并通过这些边界与其他类型的对象进行通信。应用程序中特定 MVC 类型的对象集合有时称为*层,*例如模型层。
MVC 是 Cocoa 应用程序良好设计的核心。采用这种模式的好处很多。这些应用程序中的许多对象往往更具可重用性,并且它们的接口往往被更好地定义。具有 MVC 设计的应用程序也比其他应用程序更容易扩展。此外,许多 Cocoa 技术和架构都基于 MVC,并要求您的自定义对象扮演 MVC 角色之一。
(1)模型对象(Model)
模型对象封装特定于应用程序的数据,并定义操作和处理该数据的逻辑和计算。例如,模型对象可能代表游戏中的角色或地址簿中的联系人。一个模型对象可以与其他模型对象具有一对一和多对多的关系,因此有时应用程序的模型层实际上是一个或多个对象图。
在数据加载到应用程序后,作为应用程序持久状态一部分的大部分数据(无论持久状态存储在文件中还是数据库中)都应该驻留在模型对象中。因为模型对象代表与特定问题域相关的知识和专业知识,所以它们可以在类似的问题域中重复使用。
(2)查看对象(View)
视图对象是应用程序中用户可以看到的对象。视图对象知道如何绘制自己并且可以响应用户操作。视图对象的一个主要目的是显示来自应用程序模型对象的数据并允许编辑该数据。尽管如此,视图对象通常与 MVC 应用程序中的模型对象分离。
因为您通常会重用和重新配置它们,所以视图对象提供了应用程序之间的一致性。UIKit 和 AppKit 框架都提供了视图类的集合,Interface Builder 在其库中提供了数十个视图对象。
(3)控制器对象(Contoller)
控制器对象充当一个或多个应用程序的视图对象与其一个或多个模型对象之间的中介。因此,控制器对象是一个管道,视图对象通过它了解模型对象的变化,反之亦然。控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期。
【总结】
- Model层:数据模型,用来存储数据
- View层:视图界面,用来展示UI界面和响应用户交互
- Controller:控制器(大管家角色),监听模型数据的改变和控制视图行为、处理用户交互
2、MVVM框架简介
既然MVC这么好,那为什么还要使用MVVM?
随着App应用功能的强大Controller的负担越来越大因此在MVC的基础上繁衍出了MVVM框架。
由于Controller主要用来处理各种逻辑和数据转化,复杂业务逻辑界面的Controller非常庞大,维护困难,所以有人想到把Controller的数据和逻辑处理部分从中抽离出来,用一个专门的对象去管理,这个对象就是ViewModel,是Model和Controller之间的一座桥梁。当人们去尝试这种方式时,发现Controller中的代码变得非常少,变得易于测试和维护,只需要Controller和ViewModel做数据绑定即可,这也就催生了MVVM的热潮。
一句话总结:VM层(视图模型层)通过接口从后台M层(Model层)请求数据,VM层继而和V(View层)实现数据的双向绑定。
双向绑定:
双向是指ViewModel中的data部分和View之间的双向关系。
- 正向:数据驱动页面
- 反向:页面更新数据
绑定是指自动化处理,data改变了view随之改变,反之也是。
比如在js中,不用像传统方式那样,通过onChange事件获取用户输入,然后再通过改变innerHtml修改显示。
优点:
-
Controller清晰简洁: ViewModel分离了大部分Controller代码,更加清晰和容易维护。
-
方便测试:开发中大部分Bug来至于逻辑处理,由于ViewModel分离了许多逻辑,可以对ViewModel构造单元测试。
-
开发解耦(举两个例子):
- 一人负责逻辑实现、另一人负责UI实现;
- 敏捷开发时,会发经常发不是等后端做好了接口我们再去开发,不过在没有接口的情况下通常我们可以把Controller和View完成。
缺点:
- 代码较多
- 需要对每个Controller实现绑定,如果处理不好,反而会有一种“画虎不成反类犬”的感觉
【参考】:
- 苹果开发者文档
- https://blog.csdn.net/sun_cui_hua/article/details/75648107
- https://blog.csdn.net/weixin_34352449/article/details/86023696
- https://zhuanlan.zhihu.com/p/59467370