Android MVC 架构详解

一、前言


由于 MVP、MVVM 的兴起,MVC 在 android 中的应用变得越来越少了,但 MVC 是基础,理解好 MVC 才能更好的理解MVP,MVVM。因为后两种都是基于 MVC 发展而来的。

二、MVC 详解


我们从网上搜索 MVC 相关资料时,如果你多看几篇文章的话可能会发现,好像他们介绍的设计图都不太一样,这里罗列了大部分的设计图:

Android MVC 架构详解_第1张图片

到底上面列出的设计图哪个才是对的。其实都是对的。为什么这么说呢,这得从 MVC 的发展说起。 MVC 框架模式最早由 Trygve Reenskaug 于 1978 年在 Smalltalk-80 系统上首次提出。经过了这么多年的发展,当然会演变出不同的版本,但核心没变依旧还是三层模型 Model-View-Control。

箭头 → 代表的是一种事件流向,并不一定要持有对方,比如上图中 model → view 的事件流向,view 可以通过注册监听器的形式得到 model 发来的事件。在设计中 model view controller 之间如果要通讯,尽量设计成不直接持有,这样方便复用。也符合mvc的设计初衷 在 Android 中三者对应的关系如下:

Android MVC 架构详解_第2张图片

视图层(View) 对应于xml布局文件和java代码动态view部分。

控制层(Controller) MVC中Android的控制层是由Activity来承担的,Activity本来主要是作为初始化页面,展示数据的操作,但是因为XML视图功能太弱,所以Activity既要负责视图的显示又要加入控制逻辑,承担的功能过多。

模型层(Model) 针对业务模型,建立的数据结构和相关的类,它主要负责网络请求,数据库处理,I/O的操作。

由于 Android 中有个 god object 的存在 activity,再加上 Android 中 xml 布局的功能性太弱,所以 activity承担了绝大部分的工作。所以在 Android 中 mvc 更像是这种形式:

Android MVC 架构详解_第3张图片

因为 activity 扮演了 controller 和 view 的工作,所以 controller 和 view 不太好彻底解耦,但是在一定程度上我们还是可以解耦的。下面我们通过代码来看下,mvc 在 Android 中的实现:

Android MVC 架构详解_第4张图片

结构很简单,这里介绍下其中的关键代码

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 的操作。 我们分析下事件的流向。

  1. button 点击事件的触发:View→Controller
  2. 获取用户信息事件的触发:Controller→Model
  3. 绑定用户信息到View:Controller→View

至此MVC就讲完了,我们这里根据 sample 来总结下:

  • 具有一定的分层,model 彻底解耦,controller 和 view 并没有解耦;
  • 层与层之间的交互尽量使用回调或者去使用消息机制去完成,尽量避免直接持有;
  • controller 和 view 在 android 中无法做到彻底分离,但在代码逻辑层面一定要分清;
  • 业务逻辑被放置在 model层,能够更好的复用和修改增加业务。

你可能感兴趣的:(Android)