MVC 和MVVM

160 阅读2分钟

MVC

  • M:是数据模型Model,负责处理数据,以及数据改变时发出通知,【Notification、KVO】,Model和View不能直接通信,这样会违背MVC设计模式;

  • V:是视图View,用来展示界面,和用户进行交互,为了解藕合一般不会直接持有或者操作数据层中的数据模型【可以通过target-action、delegate、block等方式解耦】;

  • C:是控制器Controller用来调节model和View之间的交互,可以直接和model和View进行通信,操作model进行数据更新,刷新View。

优点:

View、model低耦合、高复用、容易维护。

缺点:

Controller的代码过于臃肿,如果view与model直接交互会导致view和model之间的耦合性比较大、网络逻辑会加重Controller的臃肿。

MVVM

  • MVVM衍生于MVC,是MVC的一种衍进,促进了UI代码和业务逻辑的分离,抽取Controller中的展示逻辑放到ViewModel里边。

  • M:数据模型model。

  • V:就是View和controller联系到一起,视为一个组件View,view和controller都不能直接引用模型Model,可以引用视图模型ViewModel。view、controller尽量不涉及业务逻辑,让view model去做这些事情,view controller只是一个中间人,负责接收View事件,调用viewmodel的方法,响应ViewModel的变化。

  • VM:ViewModel负责封装业务逻辑,网络处理和数据缓存,使用viewmodel会轻微增加代码量,但是总体上减少了代码的复杂性,

注意事项:

  • view引用viewModel,但反过来不行,因为如果VM跟V产生了耦合,不方便复用。即不要再View model中引入#import UIkit.h,任何视图本身根本的引用都不应该放在View model中(基本要求,必须满足)

  • viewModel可以引用model,但是反过来不行。

优点:

低耦合、可复用、数据流向清晰、而且兼容MVC,便于代码的移植,并且View Model可以拆出来独立开发、方便测试

缺点:

类会增多、viewModel会越来越庞大、调用复杂度增加、双向绑定数据会导致问题调试变得困难。

总结

  • MVVM其实是MVC的变种。MVVM只是帮MVC中的controller瘦身,把一些逻辑代码和网络请求分离出去,不让controller处理更多的东西,不会变的臃肿,MVVM和MVC可以根据实际需求进行灵活选择。

  • MVVM在使用当总,同常会使用双向绑定技术,使得model变化时,viewmodel会自动更新,而viewmodel变化时view也会自动变化,OC中可以用RAC函数响应式框架来实现响应式编程。