MVC
- Model:负责封装数据,存储和处理数据运算等工作
- View:负责数据展示、监听用户触摸等操作
- Controller:负责业务逻辑、事件响应、数据加工等工作
用户操作View,在Controller层完成业务逻辑处理,更新Model层,将数据显示在View层。
View把控制权交给Controller层,自己不执行业务逻辑;Controller层执行业务逻辑并且操作Model层,但不会直接操作View层;View和Model层的同步消息是通过观察者模式进行,而同步操作是由View层自己请求Model层的数据,然后对视图进行更新,观察者模式可以做到多视图同时更新。
- 优点:View、Model可以重复利用
- 缺点:导致Controller臃肿,代码特别多,视图一复杂起来,代码量过长,不好维护;写在Controller里View的代码无法复用;
MVP
MVP模式是MVC模式的一个演化版本
- Model:与MVC中的model没有太大的区别。主要提供数据的存储功能,一般都是用来封装网络获取的json数据的集合。Presenter通过调用Model进行对象交互。
- View:这个View可以是viewcontroller、view等控件。View负责界面展示和布局管理,向Presenter暴露视图更新和数据获取的接口
- Presenter:作为model和view的中间人,从model层获取数据之后传给view,使得View和model解耦。Present中间层负责UI改变及时更新数据;数据的改变及时的更新UI
用户操作View,在Presenter层完成业务逻辑处理,更新Model层,通过Presenter将数据显示在View层,完全隔断Model和View之间的通信。
通过接口的方式来连接view和presenter层,这样导致的问题是,如果页面过于复杂,我们的接口就会很多,为了更好的处理类似的问题,需要定义一些基类接口,把一些公共的逻辑,比如网络请求,toast,提示框等放在里面。
因为MVP不依赖Model,所以可以更好的进行组件化,把它从特定的场景中脱离出来,做到高度复用。MVP中的Presenter更多的作为框架的控制者,承担了大量的逻辑操作。
- Controller其实将view和viewController传递给了P层, 这样P层其实就拥有了控制器的权利, 完全可以行使控制器的职责.
- Controller又持有Presenter, 那么它只需要调用P层暴露出的接口, 就完全可以完成整个业务逻辑和页面展示
关于C端和P端的循环引用的问题, 直接用weak关键字就可以解决了
优点:
- 模型与视图完全分离,我们可以修改视图而不影响模型
- 可以更高效的使用模型,因为所有的交互都在Presenter内部
- 缺点:
- 由于对视图的渲染都在Presenter中,所以视图和Persenter的交互会过于频繁。
MVVM
MVVM和MVP的最大区别是采用了双向绑定机制,View的变动,自动反映在ViewModel上。
- M:Model: 作为数据的容器。
- V:View、部分ViewController组成。负责界面的展示以及用户交互的处理。
- VM:ViewModel: 负责业务逻辑处理。就是把原来ViewController层的业务逻辑和页面逻辑等剥离出来放到ViewModel层
- View持有ViewModel:在View中通过绑定的方式关联UI元素和ViewModel的属性,UI元素的属性变化和ViewMode的数据属性进行双向影响。
- ViewModel持有Model:Model为ViewModel提供数据支持,同时ViewModel的数据属性变化也会影响Model上,用于数据提交等。
- Model和ViewModel的功能区别在于,ViewModel是View提供数据支持的,其结构和View保持一致。Model来源于业务处理,保持业务数据的基本关联和完整性。
当Model层结束查询或者运算时将结果更新到ViewModel层,ViewModel层因为存在和View的绑定,使得UI层得到通知更新,体现了数据驱动界面的思想。
优点:
- 方便测试 便于代码的移植。
- 兼容MVC。
- 缺点:
- 类会增多,ViewModel会越来越庞大,调用复杂度增加。