完全解析Android項目架構(3) - MVVM

歡迎Follow我的GitHub, 關注我的簡書, 博客目錄.

MVVM

本文的合集已經編著成書,高級Android開發強化實戰,歡迎各位讀友的建議和指導。在京東即可購買:https://item.jd.com/12385680.html

Android

MVVM(Model-View-ViewModel)與MVP比較相似, 都是分離頁面邏輯與業務邏輯. View相同, 不同的是ViewModel與Presenter. Presenter從UI中抽象出View的事件邏輯; ViewModel為事件驅動頁面提供數據流.

三個架構的分析均已完成, 參考MVC, MVP, MVVM.


MVVM架構

MVVM包含三個模塊, Model, View, ViewModel.

  • Model: 即DataModel, 抽象數據源, ViewModel從Model中讀取或存儲數據.
  • View: 當用戶觸發響應事件時, 通知ViewModel, 展示提供的數據.
  • ViewModel: 提供View顯示的數據流.
MVVM

MVVM與MVP相似, 目標都是分離UI與業務邏輯.

  1. Presenter與View強綁定, 為View提供展示數據, 是一對一關系;
  2. ViewModel提供數據流, 供View弱綁定, 是一對多關系.
  3. Presenter與View相互引用; ViewModel獨立于View, View綁定ViewModel引用.
  4. View與ViewModel, 類似于消費者知道生產者, 而生產者只提供數據, 并不關心誰消費.

Model

Model, 即DataModel, 通過事件流提供多種數據源, 如網絡數據, 數據庫, 首選項(Shared Preferences)等, 負責全部的業務邏輯. Model提供泛化數據的接口, 確保業務邏輯獨立完整, 被不同頁面共享與使用, 為ViewModel提供數據.

ViewModel

ViewModel提供數據更傾向于View, 從Model中獲取必要的數據, 在封裝UI邏輯后, 供給不同View展示. ViewModel有兩點需要注意:

  1. ViewModel為View提供完整狀態的數據. 如醫生姓名與醫生科室, 當需要展示"醫生姓名+醫生科室"時, 應該提供拼接后的數據, 而不是單獨數據, 當其中一個修改時, 通過全部修改全部展示, 保證View數據最新.
  2. View把用戶事件交給ViewModel處理, 不保留任何UI邏輯.

View

View負責展示數據, 如Activity或Fragment. 在onResume綁定ViewModel, 在onPause解綁. 更新邏輯, 在ViewModel中處理, View僅負責展示數據.

private final Subscription mSubscription = new Subscription();
@Override
public void onResume() {
    super.onResume();
    mSubscription.add(mViewModel.getData()
                     .observeOn(AndroidSchedulers.mainThread())
                     .subscribe(this::updateView,
                                this::handleError));
}
@Override
public void onPause() {
    mSubscription.clear();
    super.onPause();
}

如果View屬于自定義, 則在構造器中綁定, 在onDetachedFromWindow中解綁.

測試

MVVM重要特性是降低耦合度. Model不含Android類, 只含業務邏輯, 支持單元測試; ViewModel在Model上封裝UI邏輯, 不含Android類, 支持單元測試.

ViewModel需綁定Model, 允許自由替換Model數據源. ViewModel綁定Model, 在測試時, 使用Mockito的測試數據替換Model的真實數據.

public class ViewModel {
    private final IDataModel mDataModel;

    public ViewModel(IDataModel dataModel) {
        mDataModel = dataModel;
    }

    public Observable<Data> getData() {
        return mDataModel.getData();
    }
}

優勢

MVVM的優勢是進一步解耦UI邏輯與業務邏輯. ?

  1. View與ViewModel的耦合, 弱于View與Presenter的耦合.
  2. View僅是ViewModel的消費者, 當修改UI時, 不修改ViewModel.
  3. 根據業務關注點, 創建多個高內聚的View與ViewModel, 允許多個頁面共享與替換.
  4. 徹底分離UI邏輯, 使用DataBinding分離UI顯示UI邏輯.
  5. View與ViewModel一對多, ViewModel與Model多對多.
  6. ViewModel和Model與UI界面完全解耦, 進一步提高可測試性.

MVVM, 與MVP類似, 也是非常優秀的架構模式, 在開發中, 使用架構比無序開發, 可以極大地提高項目的穩定性與可測性.

OK, that's all! Enjoy it!

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

推薦閱讀更多精彩內容