Android架构之MVC、MVP、MVVM

前言

MVC、MVP、MVVM是当下Android开发中主要的项目架构,当开发一个App时,合理的软件架构有利于后期的维护。Android开发中我们可以选择的架构只有以上三种,三种架构各有优缺点,我们可以从中选择最合适我们的架构。

MVC

MVC(Model-View-Controller)是最常见的软件架构之一,也是我们刚开始做Android开发选用的架构。

Android-MVC

数据关系为:

  • View接收用户交互指令
  • View将指令传递给Controller
  • Controller执行相关的业务逻辑,并操作Model进行数据更新
  • Control更新数据完毕后,Model通知View更新数据变化
  • View更新数据,更新界面

具体到Android项目中呢?我们知道在一个Android项目中,有Java目录下的class文件,也有res目录下的各种资源,layout里面的xml文件就对应于MVC的view层,里面都是一些view的布局代码。而各种Java Bean,还有就对应于model层,至于Controller层,当然就是各种Activity或者Fragment。

通俗一点说,比如按下了界面上的一个Button,Button是在xml里进行布局的,所以接收交互响应的是在View里,按下Button的反应,比如网络请求,HttpHelper类就是Model了,那怎么连接这两层呢,我们是通过btn.setOnClickListener()连接的,这个是写在Activity里面的,既是在Controller层了。

这里还要补充一点,Model进行数据更新完毕后,通知View进行数据更新,一般来说是通过观察者模式进行更新的。在上面的三角关系中,一个Model可能对应着多个View,通过观察者,所有注册的View都能接收到更新。例如,在我们在使用ListView的时候,更新数据是通过Adapter的notifyDataSetChanged()方法进行数据更新,如果跟进BaseAdapter的代码,就会发现,它还是通过观察者模式更新数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
//数据观察者
private final DataSetObservable mDataSetObservable = new DataSetObservable();

public boolean hasStableIds() {
return false;
}

public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}

public void unregisterDataSetObserver(DataSetObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}

/**
* Notifies the attached observers that the underlying data has been changed
* and any View reflecting the data set should refresh itself.
*/
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
}

缺点:在Android开发中,MVC大家肯定会用,但是这种模式有什么区缺点吗,肯定是有的,要不然也不会有后来的MVP、MVVM了不是。大家可以想想,xml作为View层,控制能力太弱了,比如我们要更换了背景,更换个字体颜色,xml中式无法完成的,只能写在Activity中,这样就使得作为Controller层的Activity,也充当起了View的角色,最终结果使得Activity代码过于臃肿,我在开发的过程中,稍微复杂一点的界面,Activity可以达到2000+行代码,这样的代码维护起来相信谁都会感到头痛吧。

MVP

MVP作为MVC模式的演化,解决了MVC模式的一些缺点。可以看到,View层和Model层不能直接进行通信了,转而交给Presenter层作为中间的代理。其中Model层和MVC是一样的,但是Activity和Fragment则是纯粹的View层了,不再充当Controller的角色了。所有的交互事件交给Presenter层处理。

Android-MVP

数据关系为

  • View接收用户交互请求
  • View将请求提交给Presenter层
  • Presenter层操作Model进行数据更新
  • Model层通知Presenter层数据发生变化
  • Presenter层操作View层界面更新

这样实际上将View层和Model层解耦。

在Android中,对于View,一般要有个IView的接口,Activity或者Fragment要实现这个接口。此接口主要是有关界面的操作,如下栗子中,获取EditText的输入值,显示Toast,显示和隐藏ProgressBar等。

1
2
3
4
5
6
7
8
9
public interface ILoginView {
String getUserName();
String getPassWord();
void showToast(String content);
void closeDispose(Disposable disposable);
void showProgress();
void hideProgress();
void toOtherActivity();
}
1
public class LoginActivity extends BaseActivity implements IView.ILoginView {}

对于Model,一般要有一个IModel,Model要继承这个接口:

1
2
3
4
5
public class IModel {
public interface ILoginModel {
void login(LoginBody loginBody, MyCallBack<UserLoginBean> callBack); //登录
}
}
1
public class LoginModel implements IModel.ILoginModel {}

MVVM

可以看到,和MVP比较,Presenter层换成了ViewModel层,其实View层和ViewModel层是相互绑定的关系,这意味着当更新ViewModel层数据的时候,View层会相应的变动UI。

Android-MVVM

数据关系:

  • View接收交互请求
  • View将请求提交给ViewModel
  • ViewModel操作Model进行数据更新
  • Model更新完数据,通知ViewModel数据发生变化
  • View和ViewModel是双向绑定的关系,ViewModel变化,View层会相应变化

所以MVVM模式一般要结合Google推出的DataBinding,将View和ViewModel层进行数据绑定。

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :