在Android中,业务逻辑和数据存取是紧紧耦合的,很多缺乏经验的开发者很可能会将各种各样的业务逻辑塞进某个Activity、Fragment或者自定义View中,这样会使得这些组件的单个类型臃肿不堪。如果不将具体的业务逻辑抽离出来,当UI变化时,你就需要去原来的View中抽离具体业务逻辑,这必然会很麻烦并且易出错。
MVC
MVC,全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
M:Model,数据层,主要是用来做获取数据,存储数据等业务逻辑的
V:View,视图层,用来显示Model层数据的
C:Controller:控制层,用来控制显示视图和处理接收MV传递过来的数据的
下面我们来用Android代码来写一个很简单的例子,获取数据并显示一个列表!在Android里面,视图层,MVC结构里面,相当于布局,而控制器自然就是Actvity了!好,我们来写代码:我在下面写了一个动态加载的RecyclerView
那么怎么获取数据,我们这里使用静态数据来获取。。。写一个Model接口里面包含着获取数据的操作,另外声明一个监听器负责获得数据后的操作
然后写Model层数据实现这个接口
我们获取数据的流程写出来了,那么我们总是要用的吧,下面我们就继续写Activity,就是我们Controller的代码
好的,其实MVC就这样,把业务逻辑层和视图显示给分开来处理,调用的话,直接更改DataModel里面的逻辑就可以了,是不是很简单!
MVP
(1)Presenter – 交互中间人:Presenter主要作为沟通View与Model的桥梁,它从Model层检索数据后,返回给View层,使得View与Model之间没有耦合,也将业务逻辑从View角色上抽离出来。
(2)View – 用户界面:View通常是指Activity、Fragment或者某个View控件,它含有一个Presenter成员变量。通常View需要实现一个逻辑接口,将View上的操作转交给Presenter进行实现,最后,Presenter 调用View逻辑接口将结果返回给View元素。
(3)Model – 数据的存取:Model 角色主要是提供数据的存取功能。Presenter 需要通过Model层存储、获取数据,Model就像一个数据仓库。更直白的说,Model是封装了数据库DAO或者网络获取数据的角色,或者两种数据方式获取的集合。
那么我们要怎么写呢,还是之前Android的例子!
我们声明个Contract类,里面包含着三个接口,分别是View,Presenter,和Model!
然后我们需要写获取数据逻辑是吧嗯,没错,那就继承Model类,因为我们Model和View交互还需要中介者,所以这个类需要持有Presenter对象
下面我们需要写一下中介者需要做啥,View通过Presenter来向Model获取数据是吧,所以要loaddata,Model获取完数据后是不是要给回View啊,那Model就需要调用onLoadDataSuccess()和Presenter说我拿到数据了!Presenter要怎么告诉View,所以Presenter需要持有View对象和Model对象
那么我们已经把数据和流程给理清楚了,下面就是写Activity的剧情了!和MVC一样。。。不过,有没有发现,不需要写监听函数了
区别
从上图可以看出:MVC的耦合性还是较高的,View可以直接访问Model,导致3者之间构成了回路。所以两者的主要区别是,MVP中View不能直接访问Model,需要通过Presenter发出请求,View与Model不能直接通信。
MVVM与MVP非常相似,唯一区别是View和Model进行双向绑定,两者之间有一方发生变化则会反应到另一方上。MVVM模式有点像ListView与Adapter、数据集的关系,当数据集发生变化时,调用Adapter的notifyDataSetChanged之后View就直接更新,同时它们之间又没有耦合,使得ListView变得更加灵活。