简介
在之前的很长一段时间,MVC 模式一直被应用于 Android 项目开发,随着时间的推移,MVC 模式存在的问题也逐渐暴露。Activity 作为与视图层紧密相关的角色,却被赋予了 Controller 的职责,久而久之,庞大的业务逻辑与视图之间的耦合太高,导致扩展性差,冗余繁杂。
MVP 作为目前主流的 Android 开发模式,其解决了 MVC 所暴露的问题。MVP 模式可以分离显示层与逻辑层,而他们之间的通信通过接口来完成,这样便降低了耦合,提高了扩展性。
MVP 角色分工
Model
主要提供数据处理的功能,Presenter 的操作需要一个提供数据存取的助手,那就是 Model。
View
对于 View 来说,一般是 Activity、Fragment,或者某个具体的 View,但是 View 角色本身是具有了多个操作的接口,负责 View 层与逻辑层建立通信。
Presenter
交互中间人,真正去实现业务逻辑的负责人,将 View 层与 Model 层建立关联。
MVP 应用
建立关联 View 和 Model 的业务逻辑层 Presenter。对于业务逻辑结构不是太复杂的项目,可以不单独抽出一个 Presenter 接口。
public interface Presenter<V, M> {
/**
* 关联 view 角色
*/
void attachView(V view);
/**
* 获取 view 角色
*
* @return
*/
V getView();
/**
* 是否已关联 view 角色
*
* @return
*/
boolean isViewAttached();
/**
* 取消关联 view 角色
*/
void detachView();
void referTo(M model);
}
public class BasePresenter<V, M> implements Presenter<V, M> {
protected Reference<V> mViewRef;
protected M mModel;
@Override
public void attachView(V view) {
mViewRef = new WeakReference<V>(view);
}
@Override
public V getView() {
return mViewRef == null ? null : mViewRef.get();
}
@Override
public boolean isViewAttached() {
return mViewRef != null && mViewRef.get() != null;
}
@Override
public void detachView() {
if (mViewRef == null) {
return;
}
mViewRef.clear();
mViewRef = null;
}
@Override
public void referTo(M model) {
mModel = model;
}
public M getModel() {
return mModel;
}
}
public interface Model {
}
在基类 Fragment 或 Activity 中封装 MVP 模式:
public abstract class BaseFragment<V, M extends Model, P extends BasePresenter<V, M>> extends Fragment {
protected P mPresenter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
...
createPresenterInternal();
createModelInternal();
...
}
private void createPresenterInternal() {
mPresenter = createPresenter();
if (mPresenter == null) {
return;
}
onCreatePresenter();
mPresenter.attachView((V) this);
}
protected void onCreatePresenter() {
// no-op
}
private void createModelInternal() {
if (mPresenter == null) {
return;
}
mPresenter.referTo(createModel());
}
protected abstract P createPresenter();
protected abstract M createModel();
}
抽象 View 层的工作需要根据具体的使用场景建立不同的 View 接口。其实 MVP 模式是一种思想,但是这种思想衍生出来的实现方式有很多种,以上只是 MVP 模式中的一种应用。重要的是,这种实现方式是否最大程度解决了项目中的问题,是否契合业务开发的最终目的。
MVVM 模式
MVVM 与 MVP 类似,但是也有不同。不同点在于:
- MVVM 的 View 是和 Model 进行双向绑定的关系。
- MVP 中的 View 更新需要借助 Presenter,而 MVVM 不需要。MVVM 中 View 的更新直接通过数据的变更即可自动变化。
- MVP 中需要建立大量的 View 接口,而 MVVM 不需要。
MVVM 更像是观察者模式、适配器模式等设计模式的结合体。与 RecyclerView 中,视图和数据的更新有异曲同工之妙。
MVVM 模式可以通过 Google 提供的 DataBinding 实现,DataBinding 是数据和 UI 绑定的框架,是构建 MVVM 模式的一个有利工具。
本文由
Fynn_ 原创,未经许可,不得转载!
网友评论