淺析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其實就是mvp的升級版,所有的代碼邏輯將在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)等新特性,打造了一個更加靈活高效的架構。


記錄學習,僅供參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章