前言#
這一篇準備進行一次總結,因為MVVM的關鍵已經之前講過了,就是DataBinding,所以用法就不提了,還不了解的朋友可以去看:DataBinding學習系列。
正文#
<h2>MVVM</h2>
從命名可以看的出來,僅僅是View層和Model層之前有著交互,有點類似與我們之前提到的MVC模式中去掉了Controller層。在Android中,典型的就是DataBinding,對View和Model進行了中間隔離,這個中間層被稱作ViewModel。下面就直接看例子:
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
app:image="@{@drawable/ic_launcher}"
android:background="@{@string/app_name}"/>
@BindingAdapter("bind:image")
public static void loadImage(ImageView image, Drawable resId){
image.setImageDrawable(resId);
}
這個例子我直接從之前的講解DataBinding中直接復制的,DataBinding通過自定義屬性(View),實現與之綁定的方法(Model),中間的具體怎么把自定義屬性和方法綁定在一起的過程就是ViewModel。這就是典型的MVVM模式。
的確是很方便,我們只要在MainActivity設置具體的參數就OK了。但是我們也看到,MVVM僅僅是View和Model之間的關系,并沒有涉及到具體的功能邏輯,所以在MVVM的基礎上又衍生出了MVPVM。
<h2>MVPVM</h2>
就是在MVVM的基礎上增加了Presenter層,負責處理功能邏輯。我們直接把之前的MVP模式進行修改,使用DataBinding技術,就變成了MVPVM。
首先修改MainActivity:
public class MainActivity extends AppCompatActivity implements MainView, View.OnClickListener {
private MainPresenterImpl presenter;
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setOnTextViewClickListener(this);
presenter = new MainPresenterImpl(this);
presenter.startLoading();
}
@Override
public void setText(String text) {
binding.setLoadingText(text);
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.onDestroy();
}
@Override
public void onClick(View v) {
presenter.showToast();
}
}
把之前的對View的操作全部交給ActivityMainBinding。Presenter層不變,接著為了突出MVVM的優勢,我增加了一個appendText自定義屬性:
/**
* Created by li.zhipeng on 2017/3/24.
*
* MainActivity的Model
*/
public class MainModel {
/**
* 提供模擬的網絡請求類
* */
public static void login(final String name, final String pwd, final OnCallbackListener callbackListener){
new Thread(){
@Override
public void run() {
callbackListener.onLoading();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (name.equals("lzp") && pwd.equals("lzp")){
callbackListener.onSuccess();
}
else{
callbackListener.onFailed();
}
}
}.start();
}
@BindingAdapter("bind:appendText")
public static void appendText(TextView textView, String text){
textView.setText("對面的妹紙對我說:" + text);
}
}
OK這樣我們就修改完成了。
MVPVM與之前MVP相比,優化了View和Model之間的關系,例如appendText屬性,如果不用DataBinding,我們肯定要在Presenter中定義方法,調用Model的appendText()來處理字符串,處理結束之后,再調用View的setText()方法。這里通過DataBinding作為中介,讓Model間接操作了TextView。
我按照我的理解簡單的畫了一下架構圖:
總結#
到這里我們已經介紹了MVC、MVP、MVVM、MVPVM等常用的架構模式,也看到了這些架構都是在某一個基礎上進行延伸、細分,然后產生出新的模式,不同的理解和劃分,設計出的結構也會有所不同。
從OOAD的設計原則來分析,他們都是面向對象設計,然后進行功能細分,例如邏輯層,顯示層等等,他們都是被看做某一個具體的事物,然后把對應的任務的交給他,跟日常生活中的分工都是類似的,不能出現不想當廚師的司機不是好裁縫的情況。
所以我們不能被所謂的架構模式蒙蔽雙眼,就好像666的張三豐電影里說的:記住要領,忘記招式,你就真正的學會太極了。