最近几年的移动端开发越来越红火,功能也变得越来越强大,业务逻辑也变得越来越复杂了,因此对系统扩展性的要求越来越高。为了更好地进行移动端架构设计,我们最常用的就是MVC和MVP,而MVC和MVP在目前的开发趋势中也是广泛流行和使用的。很多框架架构设计思想都是采用了MVP设计模式,比如最近一年多很流行的框架结构就是采用了MVP,RxJava+Retrofit+EvenBus这一体系采用的就是MVP,而RxJava处理了异步的逻辑复杂性问题,让代码看起来更简洁和清晰。
1MVC设计模式
1.MVC的定义
MVC(Model-View-Controller):M指逻辑层,V指视图层、C指控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式,而C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新,这与《设计模式》中的观察者模式是完全一样。
2.为何用MVC
从用户的角度出发,用户可以根据自己的需求,选择自己合适的浏览数据的方式。
从开发者的角度,MVC把应用程序的逻辑层与界面是完全分开的,这样,界面设计人员可以直接参与到界面开发,程序员就可以把精力放到逻辑层上。而不是设计人员把所有的材料交给开发人员,由开发人员来实现界面。
3.MVC的通信方式
首先,View发送命令道Controller,然后Controller处理完业务逻辑后让Model改变状态,最后由Model将新的数据发送到View,用户得到数据响应。
Android中的MVC
1. 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便 的引入。
2. 控制层(Controller):Android的控制层通常是在Activity中实现。
3. 模型层(Model):对数据库的操作、对网络等的操作都应该再Model里面出来, 当然对业务计算等操作也是必须放在该层的。
2MVP设计模式
1.MVP的定义
MVP(Model-View-Presenter):MVP其实是由MVC演变而来的,其中的M依然是指逻辑模型,V依然是指视图模型,而P(中间桥梁)则代替了C成为了逻辑控制器的角色。
2.MVC和MVP到底有啥区别
区别就在于MVP中View并不直接使用Model,它们之间的通信是通过Presenter(MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过Controller。我们知道在MVC里,View是可以直接访问Model的。从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,即View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。
3.MVP的通信方式
首先MVP各部分之间的通信都是双向的,但是唯独View于Model之间是不发生联系的,二者之间的通信都是通过Presenter传递的。在MVP里,应用程序的逻辑主要在Presenter来实现,其中的View是很薄的一层。在这个过程中,View是很简单的,能够把信息显示清楚就可以了。在后面,根据需要再随便更改View,而对Persenter没有任何的影响了。如果要实现的UI比较复杂,而且相关的显示逻辑还跟Model有关系,就可以在View和Presenter之间放置一个Adapter。由这个Adapter来访问Model和View,避免两者之间的关联。而同时,因为Adapter实现了View的接口,从而可以保证与Presenter之间接口的不变。这样就可以保证View和Persenter之间接口的简洁,又不失去UI的灵活性。在MVP模式里,View只应该有简单的Set/Get的方法,用户输入和设置界面显示的内容,除此就不应该有更多的内容,绝不容许之间访问Model,这就是与MVC很大的不同之处。
4.MVP的优缺点
模型与视图完全分离,我们可以修改视图而不影响模型
可以更高效地使用模型,因为所有的交互都发生在一个地方--->persenter内部
我们可以将一个presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁。
如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)
由于对视图的渲染放在了Presenter中,所以视图和Presenter的交互会过于频繁。如果Presenter过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密。一旦视图需要变更,那么Presenter也需要变更了。
3MVVM设计模式
1.MVVM的定义
MVVM(Model-View-ViewModel):MVVM和MVP的区别其实不大,只不过是把Presenter层换成了ViewModel层,再有就是View层和ViewModel层是相互绑定的关系,当我们更新ViewModel层的数据的时候,View层会相应的更新UI。
2.MVVM的通信方式
MVVM它采用的是数据绑定(data-binding)方式,而且是双向绑定:View绑定到ViewModel,然后执行一些命令在向它请求一个动作。而反过来,ViewModel跟Model通讯,告诉它更新来响应UI。
3.MVVM有点
MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大有点
低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的“View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
可重用性。把一些视图逻辑放在一个ViewModel里面,让很多View重用这段视图逻辑。
独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。
可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。