一. 前言
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去更改显示的内容。
| 12
 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文件。
| 12
 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处理数据。
| 12
 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发生改变的时候可以通过调用Adapter的notifyDataSetChanged方法来通知组件数据发生变化,这时Adapter会调用getView方法重新显示内容。具体代码这里就不分析了。
四. MVC的优缺点
1. 优点
- 视图层(View)与模型层(Model)解偶,通过Controller来进行联系。
- 模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。
2. 缺点
参考文章
Android框架模式——MVC