天天看點

淺析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)等新特性,打造了一個更加靈活高效的架構。

記錄學習,僅供參考。