本文的合集已經編著成書,高級Android開發強化實戰,歡迎各位讀友的建議和指導。在京東即可購買:https://item.jd.com/12385680.html
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與MVP相似, 目標都是分離UI與業務邏輯.
- Presenter與View強綁定, 為View提供展示數據, 是一對一關系;
- ViewModel提供數據流, 供View弱綁定, 是一對多關系.
- Presenter與View相互引用; ViewModel獨立于View, View綁定ViewModel引用.
- View與ViewModel, 類似于消費者知道生產者, 而生產者只提供數據, 并不關心誰消費.
Model
Model, 即DataModel, 通過事件流提供多種數據源, 如網絡數據, 數據庫, 首選項(Shared Preferences)等, 負責全部的業務邏輯. Model提供泛化數據的接口, 確保業務邏輯獨立完整, 被不同頁面共享與使用, 為ViewModel提供數據.
ViewModel
ViewModel提供數據更傾向于View, 從Model中獲取必要的數據, 在封裝UI邏輯后, 供給不同View展示. ViewModel有兩點需要注意:
- ViewModel為View提供完整狀態的數據. 如醫生姓名與醫生科室, 當需要展示"醫生姓名+醫生科室"時, 應該提供拼接后的數據, 而不是單獨數據, 當其中一個修改時, 通過全部修改全部展示, 保證View數據最新.
- 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邏輯與業務邏輯. ?
- View與ViewModel的耦合, 弱于View與Presenter的耦合.
- View僅是ViewModel的消費者, 當修改UI時, 不修改ViewModel.
- 根據業務關注點, 創建多個高內聚的View與ViewModel, 允許多個頁面共享與替換.
- 徹底分離UI邏輯, 使用DataBinding分離UI顯示與UI邏輯.
- View與ViewModel一對多, ViewModel與Model多對多.
- ViewModel和Model與UI界面完全解耦, 進一步提高可測試性.
MVVM, 與MVP類似, 也是非常優秀的架構模式, 在開發中, 使用架構比無序開發, 可以極大地提高項目的穩定性與可測性.
OK, that's all! Enjoy it!