MVC模式
MVC(Model-View-Controller,模型-视图-控制器)模式是20世纪80年代Smalltalk-80出现的一种软件设计模式,其后来得到了广泛的应用。它用一种业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,无须重新编写业务逻辑。Android中MVC的角色定义如下。
•模型层(Model):我们针对业务模型,建立的数据结构和相关的类,就可以理解为Model。Model是与View无关,而与业务相关的。
•视图层(View):一般采用 XML 文件或者 Java 代码进行界面的描述,也可以使用JavaScript+HTML等方式作为View层。
•控制层(Controller):Android 的控制层通常在 Activity、Fragment 或者由它们控制的其他业务类中。
Android中的MVC也有它的缺点:
•Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,接受并处理来自用户的操作请求,进而做出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。
•View层和Model层相互耦合,不易开发和维护。为了解决以上问题,产生了MVP以及MVVP这两种框架。关于MVC,这里就不用代码来举例了,想必读者应该已经非常熟悉了。接下来我们学习MVP模式。
MVP模式
MVP(Model-View-Presenter)是MVC的演化版本,MVP的角色定义如下。
•Model:主要提供数据的存取功能。Presenter需要通过Model层来存储、获取数据。
•View:负责处理用户事件和视图部分的展示。在Android中,它可能是Activity、Fragment类或者是某个View控件。
•Presenter:作为View和Model之间沟通的桥梁,它从Model层检索数据后返回给View层,使得View和Model之间没有耦合。
在MVP里(见图10-2),Presenter完全将Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时可以保持Presenter的不变,这点符合面向接口编程的特点。View只应该有简单的Set/Get方法,以及用户输入和设置界面显示的内容,除此之外就不应该有更多的内容。绝不允许View直接访问Model,这就是其与MVC的很大不同之处。
MVVM模式
MVVM(Model-View-ViewModel)最早于2005年被微软的WPF和Silverlight的架构师John Gossman提出。将Presenter改为ViewModel,其和MVP类似,不同的是ViewModel跟Model和View进行双向绑定:当View发生改变时,ViewModel通知Model进行更新数据;同理Model数据更新后,ViewModel通知View更新。MVVM的结构图如图10-5所示。在2015年Google的I/O大会中,发布了MVVM的支持库Data Binding。因此,在讲到MVVM的实现前,我们首先要了解Data Binding。
解析Data Binding
在 Data Binding 之前,我们不可避免地要编写大量诸如findViewById()、setText()和setOnClickListener()等代码。通过 Data Binding,我们可以通过声明式布局以精简的代码来绑定应用程序逻辑和布局,这样就不用编写大量的模板代码了。若想使用 Data Binding,要确保Android 的 Gradle 插件版本不低于1.5.0-alpha1,Android Studio的版本不低于1.3。