常用Android架構設計模式(三)MVVM模式和總結

前言#

這一篇準備進行一次總結,因為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的張三豐電影里說的:記住要領,忘記招式,你就真正的學會太極了。

Demo下載地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容