Android MVC MVP和MVVM

这是一个关于MVC、MVP、MVVM三种软件架构模式的笔记。

MVC

简单的来说,最基本的定义如下:

  • M:Model层,数据模型。
  • V:View层,界面。
  • C:Controller层,逻辑。

将数据在界面上展示出来,就是一个最简单的应用场景。MVC的主要特点:M和V可以直接通信,通常是单向的。

MVP

和MVC最大的区别是,首先,中间层的名字用Controller变成Presenter,这里简称为P层,P层和V层、P层和M层是可以双向通信的,但是V和M彼此再也不直接来电了。

MVVM

MVVM的理解可以在MVP上更进一层,P层被一个叫ViewModel层的中间层取代。View层和ViewModel层从双向通信变成双向绑定。

MVVM实践

我始终认为,架构啊模式啊是一种思想,严格抠字眼意义不大。其实熟悉常用的设计模式,那么MVC和MVP并不难理解,而MVVM,由于在最近一次Android大会中,Google推出了Data Binding框架,这里打算按照相关教程,跑跑例子。

简单的例子

Model层

Model层用一个User类代表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class User {
private String firstName;
private String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}

View层

View层用一个布局文件activity_main.xml表示:

1
2
3
4
5
6
7
8
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
</data>
<!--原先的根节点(Root Element)-->
<LinearLayout>
....
</LinearLayout>
</layout>

我个人认为data元素就相当于接口,View层则布局在元素里面。

data可以这么写:

1
2
3
<data>
<variable name="user" type="com.xxx.User" />
</data>

也可以这么写:

1
2
3
4
<data>
<import type="com.xxx.User" />
<variable name="user" type="User" />
</data>

在布局中,就可以调用变量:

1
2
3
4
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}" />

VM层

具体的代码如下:

1
2
3
4
5
6
7
8
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityBasicBinding binding = DataBindingUtil.setContentView(
this, R.layout.activity_main);
User user = new User("X", "L");
binding.setUser(user);
}

这样就实现了绑定。基本完成了一个MVVM实例。MVVM其实也有争论,关于它的不同见解也可以见参考中所列的文章。

Google出的Databinding框架还有很多高阶的使用方法,未完待续,慢慢填坑…

参考: