由于 MVP、MVVM 的兴起,MVC 在 android 中的应用变得越来越少了,但 MVC 是基础,理解好 MVC 才能更好的理解MVP,MVVM。因为后两种都是基于 MVC 发展而来的。
我们从网上搜索 MVC 相关资料时,如果你多看几篇文章的话可能会发现,好像他们介绍的设计图都不太一样,这里罗列了大部分的设计图:
到底上面列出的设计图哪个才是对的。其实都是对的。为什么这么说呢,这得从 MVC 的发展说起。 MVC 框架模式最早由 Trygve Reenskaug 于 1978 年在 Smalltalk-80 系统上首次提出。经过了这么多年的发展,当然会演变出不同的版本,但核心没变依旧还是三层模型 Model-View-Control。
箭头 → 代表的是一种事件流向,并不一定要持有对方,比如上图中 model → view 的事件流向,view 可以通过注册监听器的形式得到 model 发来的事件。在设计中 model view controller 之间如果要通讯,尽量设计成不直接持有,这样方便复用。也符合mvc的设计初衷 在 Android 中三者对应的关系如下:
视图层(View) 对应于xml布局文件和java代码动态view部分。
控制层(Controller) MVC中Android的控制层是由Activity来承担的,Activity本来主要是作为初始化页面,展示数据的操作,但是因为XML视图功能太弱,所以Activity既要负责视图的显示又要加入控制逻辑,承担的功能过多。
模型层(Model) 针对业务模型,建立的数据结构和相关的类,它主要负责网络请求,数据库处理,I/O的操作。
由于 Android 中有个 god object 的存在 activity,再加上 Android 中 xml 布局的功能性太弱,所以 activity承担了绝大部分的工作。所以在 Android 中 mvc 更像是这种形式:
因为 activity 扮演了 controller 和 view 的工作,所以 controller 和 view 不太好彻底解耦,但是在一定程度上我们还是可以解耦的。下面我们通过代码来看下,mvc 在 Android 中的实现:
结构很简单,这里介绍下其中的关键代码
public interface BaseModel {
void onDestroy();
}
BaseModel 顾名思义就是所有业务逻辑 model 的父类,这里的 onDestroy() 方法用于跟 activity 或者 fragment 生命周期同步,在destroy 做一些销毁操作。
public interface Callback1 {
void onCallBack(T t);
}
public interface Callback2 {
void onCallBack(T t,P p);
}
Callback 是根据 View 或者 Controller 调用 Model 时回调的参数个数选择使用。
public class SampleModel implements BaseModel{
public void getUserInfo(String uid,Callback1 callback)
{
UserInfo userInfo= new HttpUtil().get(uid);
callback.onCallBack(userInfo);
}
@Override
public void onDestroy() {
}
public class UserInfo
{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
SampleModel 是我们业务逻辑的具体实现。
public class SampleActivity extends AppCompatActivity {
private SampleModel sampleModel;
Button button;
EditText textView;
TextView tvAge,tvName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sample);
sampleModel=new SampleModel();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getUserInfo(textView.getText().toString());
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
sampleModel.onDestroy();
}
/**
* 获取用户信息
* @param uid
*/
private void getUserInfo(String uid)
{
sampleModel.getUserInfo(uid, new Callback1() {
@Override
public void onCallBack(SampleModel.UserInfo userInfo) {
setDataToView(userInfo);
}
});
}
/**
* 设置用户信息到view
*/
private void setDataToView(SampleModel.UserInfo userInfo)
{
tvAge.setText(userInfo.getAge());
tvName.setText(userInfo.getName());
}
}
前面说了 Activity 充当 View 和 Controller,但是我们依然要区分到底哪一部分是 View 的操作,哪一部分是 Controller 的操作。 我们分析下事件的流向。
至此MVC就讲完了,我们这里根据 sample 来总结下: