天天看点

浅析MVC、MVP、MVVM架构

浅析MVC、MVP、MVVM架构

搞懂Android三大架构

前言

梳理一下MVC、MVP、MVVM架构,逐一解析,让你对这个三个架构有初步认识。根据它们的优缺点,选择最合适的架构运用在自己的项目中。

最原始的MVC:

  • M:model,项目中bean,sp,database,file以及操作数据相关的类。
  • V:view,项目中的xml视图文件。(其实activity和fragment也可以理解成view,因为我们需要它们展示界面,以及一些弹窗,但更多承载的是control)
  • C:control,项目中的activity,fragment,用来编写代码逻辑。

MVC是通过Control将view和model联系在一起。举一个最简单的列子,比如我们有一个StudentBean对象,对象中有name和age属性。我们需要通过网络请求的方式获取name和age的值,并创建StudentBean对象。xml视图中有两个TextView需要分别展示name和age。

功能逻辑:

  1. 新建xml视图,创建两个TextView。
  2. 在actvity中展示视图,并且通过findViewById获取到TextView。
  3. 创建StudentBean类
  4. 在activity中通过网络请求的方式获取StudentBean。
  5. 在activity中把StudentBean的name和age赋值给TextView。

其中1、2步骤属于View的操作,3步骤是model。4、5步骤是Control。

我们不难发现,Control(activity)需要完成view和model的连接。这也就是mvc架构的弊端,大量的代码容积在activity中,不利于代码的管理和阅读。当然我们平时写代码的时候并不会把所有的功能逻辑都写在activity中,可能会封装一些辅助类来完成对应的功能。但是这些方法的调用也都是在activity中触发的。虽然代码上有所简洁,但是逻辑依旧不够清晰。

升级版MVP:

  • M:model,项目中bean,sp,database,file以及操作数据相关的类。
  • V:view,项目中的xml视图文件。(其实activity和fragment也可以理解成view,因为我们需要它们展示界面,以及一些弹窗,但更多承载的是control)
  • P:presenter,接替了mcv中 C 的工作,解放出activity或者fragment。

MVP其实就是mvc的升级版,所有的代码逻辑将在presenter中完成,并且将view和model相互连接在一起,view和model之间并没有直接的关联。只需要view提供相关的接口,然后再在presenter回调其接口,将model的数据返回给view就可以了。此时的activity更多充当的是view的工作,它只需要提供接口给presenter就可以了,然后等待presenter的回调,去更新对应的视图。

下面我们通过代码来搭建MVP架构

以下,View部分:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

    <TextView
        android:id="@+id/tv_age"
        android:layout_width="match_parent"
        android:layout_height="50dp" />
</LinearLayout>
           

以下,这并不是实际的View,只是给View(Activity)提供的接口

import com.Student;

public interface MyView {

    void setStudent(StudentBean bean);
}

           

以下,Activity也是属于View,提供接口给Presenter回调,用来传递model,刷新界面

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.TextView;

import com.showinfo.yungui.R;

public class MyActivity extends Activity implements MyView {

    private TextView tv_name;
    private TextView tv_age;

    private MyPresenter myPresenter;

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

        tv_name = findViewById(R.id.tv_name);
        tv_age = findViewById(R.id.tv_age);

        myPresenter = new MyPresenter(this);
        myPresenter.getData();
    }

    @Override
    public void setStudent(StudentBean bean) {
        tv_name.setText(bean.getName());
        tv_age.setText(bean.getAge());
    }
}

           

在Presenter中封装数据,将view和model通过接口的方式关联

import org.xutils.HttpManager;

public class MyPresenter {

    private MyView myView;

    public MyPresenter(MyView myView) {
        this.myView = myView;
    }

    public void getData(){
        //此出应该通过网络请求获取StudentBean,我们直接模拟数据
        StudentBean studentBean=new StudentBean();
        studentBean.setAge("12");
        studentBean.setName("mark");
        myView.setStudent(studentBean);
    }
}
           

mvp很好得解放了activity,让view和model通过presenter关联。但是需要view层提供接口,如果当前得功能逻辑比较复杂,那么就需要提供大量得接口给presenter,所以依然存在弊端。

终极版MVVM:

  • View: 对应于Activity和XML,负责View的绘制以及与用户交互。
  • Model: 实体模型。
  • ViewModel: 负责完成View与Model间的交互,负责业务逻辑。

MVVM的目标和思想与MVP类似,利用数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。

记录学习,仅供参考。