一. 前言

1. 介绍

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种框架模式。

  • Model:模型层,负责处理数据的加载或存储。
  • View:视图层,负责界面数据的展示,与用户进行交互。
  • Controller:控制器层,负责逻辑业务的处理。

2. 作用

将业务逻辑、数据、界面分离的一种代码组织方式,修改界面时无需去修改业务逻辑。

3. 流程

  • View接受用户的请求,然后将请求传递给Controller。
  • Controller进行业务逻辑处理后,通知Model去更新。
  • Model数据更新后,通知View去更新界面显示。

二. MVC实例

Android中一般布局的XML文件就是View层,Activity则充当了Controller的角色。

根据我们的需要编写模型类。

1. Model层

创建一个数据模型,能够保存一个数字,并有一个更新的方法,数据更新完后会通知UI去更改显示的内容。

1
2
3
4
5
6
7
8
9
public class NumModel {
private int num = 0;

public void add(ControllerActivity controllerActivity){
num++;
controllerActivity.updateUI(num+"");
}

}

2. View层

View层在Android中对应的就是布局的XML文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ControllerActivity"
android:orientation="vertical"
android:gravity="center">

<TextView
android:id="@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_marginBottom="10dp"
/>

<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击+1"
/>

</LinearLayout>

3. Controller层

Android中一般由Activity来充当Controller。Controller一方面接收来自View的事件,一方面通知Model处理数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ControllerActivity extends AppCompatActivity {

private TextView textView;
private Button button;
private NumModel numModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

textView = findViewById(R.id.tv_show);
button = findViewById(R.id.btn_add);

numModel = new NumModel();

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
numModel.add(ControllerActivity.this);
}
});
}

public void updateUI(String s) {
textView.setText(s);
}
}

4. 运行结果

5. 源码

MVCTest

三. Android中的源码应用

Android中最典型的MVC莫过于ListView了,要显示的数据为Model,而要显示的ListView就是View了,Adapter则充当着Controller的角色。当Model发生改变的时候可以通过调用AdapternotifyDataSetChanged方法来通知组件数据发生变化,这时Adapter会调用getView方法重新显示内容。具体代码这里就不分析了。

四. MVC的优缺点

1. 优点

  • 视图层(View)与模型层(Model)解偶,通过Controller来进行联系。
  • 模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。

2. 缺点

  • Android中使用了Activity来充当Controller,但实际上一些UI也是由Activity来控制的,比如进度条等。因此部分视图就会跟Controller捆绑在同一个类了。同时,由于Activity的职责过大,Activity类的代码也会迅速膨胀。

  • MVC还有一个重要的缺陷就是View跟Model是有交互的,没有做到完全的分离,这就会产生耦合。

参考文章

Android框架模式——MVC