淺析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。
功能邏輯:
- 新建xml視圖,創建兩個TextView。
- 在actvity中展示視圖,並且通過findViewById獲取到TextView。
- 創建StudentBean類
- 在activity中通過網絡請求的方式獲取StudentBean。
- 在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)等新特性,打造了一個更加靈活高效的架構。
記錄學習,僅供參考。