我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情
简介
关于MVC的一些讨论,可以参考:https://blog.csdn.net/ddnosh/article/details/78987944
MVP的架构组成如下:
相对于MVC架构,MVP架构对应的内容也有了调整:
V层对应Activity和Fragment,或者自定义的View;
P层需要自己创建,用来处理业务逻辑;
M层同MVC的M,也是需要自己创建,用来处理数据的。
优点
相对于MVC的缺点,MVP做了很大的改进:
- 明确了各个层级的职责范围
View层改为Activity和Fragment,只负责UI的更新;
Presenter层角色变成Controller,只负责业务逻辑处理;
而Model层跟MVC架构中的Model一样,负责底层功能模块实现; - 避免了跨层级交互
View只和Presenter交互,Presenter只和Model交互,而且层级间交互只通过接口进行,避免了View层直接接触Model层的可能; - Presenter不一定对应一个固定的View,其它的View也可以使用Presenter;
由于Presenter暴露出去的是接口,同样Presenter层可以用来进行业务逻辑的单元测试;
缺点
由于三个层之间是通过接口实现访问的,固而会增加不少的接口;
而且会造成从View层直到Model层使用到的类会比较多,流程不是那么地直观;
适用范围
项目功能较多,版本迭代频繁,人员分工明确。
实例
这里的MVP使用了泛型实现。
V层:
public class MVPActivity extends BaseTActivity<MVPPresenter, MVPModel> implements MVPContract.View{
private TextView mContent;
@Override
protected int getContentViewLayoutID() {
return R.layout.activity_architecture_mvp_activity;
}
@Override
protected void initViewsAndEvents(Bundle savedInstanceState) {
mContent = findViewById(R.id.tv_activity_mvp);
mContent.setText("this is MVPActivity");
mPresenter.initData();
}
@Override
public void refreshView(final String result) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mContent.setText(result);
}
});
}
}
P层:
public class MVPPresenter extends MVPContract.Presenter {
@Override
public void initData() {
String book = mModel.getBook();
getView().refreshView(book);
}
}
M层:
public class MVPModel implements MVPContract.Model {
@Override
public String getBook() {
String mBook = "民谣";
return mBook;
}
}