(MVVM的优点和缺点)
什么是MVVM?
MVVM( Model-View-ViewModel子控件的事件驱动模型),也就是轻量级的控制器架构。它本质上就是MVC的改进版。MVVM 就是将其中的View 的状态和行为抽象化,将视图 UI 和业务逻辑分开。
Model就是Entity,定义数据; View实现视图 UI; ViewModel负责请求发送及业务逻辑; UIViewController只负责生成数据(Model),View(视图 UI), ViewModel(请求发送及业务逻辑)三者的对象与协调他们完成具体的页面。
MVVM( Model View-Model Controller View)就是MVC设计模式的更先进进化,符合它进化的方向。每个人对MVVM了解不同和使用技术不同,最终实现的MVVM架构也不同。
数据源被强化,不单只是请求过来的数据还包括,数据在本页面应该处于的状态(例如:根据请求,支付页面是企业支付,不需要显示第三方支付选择框,model增加了这样的状态。当然这样的状态可以改变,用户重新选择了支付方式,选择个人支付,该状态要根据用户的行为而改变。),数据源对象在本页面或本模块中共享,一旦一个地方改变,本页面或模块中的所有数据源的内容都改变,保证了数据的一致性。它的全局共享性是它的一大特色。
一个页面可以有一个View-Model,也可以有多个View-Model,这个可以根据页面的复杂度和View(调用View-Model的View)是否在其它页面重用。若有View调用请求对象发送请求并且被其它页面重用该View,那么该View不能共享数据源。View-Model一般持有本页面或本模块的共享数据源。
控制器专注于自己的核心功能:页面的跳转,跨本页面多个视图的操作,数据源数据的初始化,从上一个页面接收数据转化为本页面的数据源(有的页面不发送请求只是显示数据,有的页面需要上也个页面接收关键字段(如“订单号)作为本页面请求的参数),子视图页面的创建和布局,子视图页面的block函数,状态栏,导航栏,页面跳转方式(有的页面需要跳转后销毁本页面—地图页面);
View增强了两大功能:持有全局数据源,根据数据源进行显示和布局;可以直接调用请求对象发送请求,来刷新数据或页面跳转。可以看到View已经具有部分控制器的功能(调用View-Model发送http请求,刷新页面),并且View根据抽象的需要可以在不同页面或模块间共享使用。
MVVM一般包含页面(或模块)总文件夹,
- Entity文件夹(model对象或模块内的编译宏),
- View文件夹(视图文件,该文件夹下可能包含子ViewModel文件夹),
- 图片库(Assets.xcassets),
- ViewController文件夹(控制器对象),
- ViewModel文件夹(http请求对象)。 除了这个5个基本文件夹外还可能包含序列化model的文件夹。
MVVM设计模式的优点
序号 | 优点 | 缺点 |
---|---|---|
1 | 双向绑定技术,当Model变化时,View-Model会自动更新,View也会自动变化。 | 数据绑定使得 Bug 很难被调试,数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。 |
2 | View的功能进一步的强化,View可以像控制器一样具有自己的View-Model。 | 一个大的模块中,model也会很大,虽然使用方便了也很容易保证了数据的一致性,当长期持有,不释放内存,就造成了花费更多的内存。 |
3 | 可以对View或ViewController的数据处理部分抽象出来一个函数处理model。这样它们专职页面布局和页面跳转,它们必然更一步的简化。 | 数据双向绑定不利于代码重用。客户端开发最常用的重用是View,但是数据双向绑定技术,让你在一个View都绑定了一个model,不同模块的model都不同。那就不能简单重用View了。 |
MVVM设计模式的优缺点之我见及改进
MVVM更高级更先进表现在解放了控制器(Controller),就是轻量级控制器。这个批评者也没有否定。MVVM不影响代码重用,其实抽象出来的一个一个小View就是为了代码重用的。反对者所谓的把网络请求封装到类里也就是View-Model。 其实对它贬低最多的只剩下集优缺点于一身的双向绑定技术。那么他们也不治之症,也可以改进。 对于调试困难的问题,确实存在,可以通过日志系统来定位,对数据被修改的地方进行敏感的地方进行日志打印。不会你的软件没有日志系统吧? 对于影响内存问题,你可以通过划分模块时,把一个页面或两到三个页面划分为一个模块,那样应用的model也不大,内存开销很小。我大都把每个页面多划分一个模块,减少耦合度,软件开发的高内聚低耦合的设计思想大家都懂吧!若把一个项目的数据都整合到一个面面俱到的model, 那除非傻子才那么做,就是那样做了,那也不符合MVVM模式了。 对于数据双向绑定不利于代码重用确实是一个问题。基本上重用的代码model都不相同。你可以对这两个model抽象成一个组合model.也可以观察你这个View需要哪些必须的数据,把它当变成成员变量,让他不绑定model.若这个View在两个模块使用,并且发送请求,那么你可以给这个View抽象为一个新的View-Model.
标签:MVVM,哪些,数据源,优点,Model,View,model,页面 From: https://blog.51cto.com/u_15312559/5827302