什么是MVP模式?
这个MVP可不是腾讯游戏《王者荣耀》中的MVP。我们今天要讨论的MVP其实同MVC一样,是一种编程模式和思想,也许更准确地讲是一种架构。
MVP和MVC的区别
提到MVP模式,大家自然避免不了要和我们以前常用的MVC模式进行对比。关于MVP和MVC的区别,此处我们就不重复造轮子了,给大家推荐两篇文章:
MVP模式的介绍
先上两张示例图(网上的图大同小异,都一样)
mvp耦合图示:

mvp使用交互流程图示:

MVP 全称是Model – View – Presenter ,是模型(model)-视图(view)-呈现器(presenter)的缩写。
Model:业务逻辑和数据处理(数据库存储操作,网络数据请求,复杂算法,耗时操作)。
View : 对应于Activity,负责View的绘制以及与用户交互。
Presenter:负责完成View于Model间的交互 (有一点还需要注意,presenter是双向绑定的关系,因此,在设计的时候就要注意接口和抽象的使用,尽可能的降低代码的耦合度,这也是mvp的宗旨)。
MVP模式使用示例佐证
责任划分:
Model: 定义并实现获取数据操作(如数据库读取、网络加载)的接口
View: 定义并在Activity,Fragment等中实现用于界面处理(初始化,数据展示)的接口
Presenter: 定义用于调用Model中的数据请求方法的接口,实现此接口,并实现Model中定义的数据请求的接口
数据请求接口(如数据库读取、网络加载)的定义:
/ * Model层接口---实现该接口的类负责实际的获取数据操作,如数据库读取、网络加载 */ public interface IModel {
void getData(Model.LoadDataCallback callback); }
数据请求接口的实现:
/ * 实现IModel接口,负责实际的数据获取操作(数据库读取,网络加载等),然后通过自己的接口(LoadDataCallback)反馈出去 */ public class Model implements IModel {
@Override public void getData(final LoadDataCallback callback) {
//数据获取操作,如数据库查询、网络加载等 new Thread() {
@Override public void run() {
try {
//模拟耗时操作 Thread.sleep(3000); //获取到了数据 String data = "我是获取到的数据"; //将获取的数据通过接口反馈出去 callback.success(data); } catch (InterruptedException e) {
e.printStackTrace(); //获取数据失败的回调 callback.failure(); } } }.start(); } / * * 用于回传请求的数据的回传 */ public interface LoadDataCallback {
void success(String taskId); void failure(); } }
/ * View层接口---执行各种UI操作,定义的方法主要是给Presenter中来调用的 */ public interface IView {
void showLoadingProgress(String message); void showData(String text); }
在Activity,Fragment等中对接口的实现:
/ * 实现IView接口并实现各种UI操作的方法(其他的业务逻辑在Presenter中进行操作) */ public class ViewActivity extends AppCompatActivity implements IView {
private Button mBtnShowToast; private TextView mText; private MyHandler mHandler = new MyHandler(ViewActivity.this); private IPresenter mPresenter; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_mvp); //实例化Presenter,并将实现了IView接口的类传入进去 mPresenter = new Presenter(ViewActivity.this); mBtnShowToast = findViewById(R.id.btn_show_toast); mText = findViewById(R.id.text); mBtnShowToast.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
//通过Presenter来实现业务逻辑操作,View层只负责UI相关操作 mPresenter.loadData(); } }); } @Override public void showLoadingProgress(final String message) {
mHandler.post(new Runnable() {
@Override public void run() {
mText.setText(message); } }); } @Override public void showData(final String text) {
mHandler.post(new Runnable() {
@Override public void run() {
mText.setText(text); } }); } private static class MyHandler extends Handler {
//弱引用,防止内存泄露 WeakReference<ViewActivity> weakReference; public MyHandler(ViewActivity activity) {
this.weakReference = new WeakReference<ViewActivity>(activity); } @Override public void handleMessage(Message msg) {
switch (msg.what) {
case 1: weakReference.get().mText.setText(msg.what); break; } } } }
/ * Presenter层接口---控制Model层的数据操作及调用View层的UI操作来完成“中间人”工作 */ public interface IPresenter {
void loadData(); }
定义用于调用Model中的数据请求方法的接口,实现此接口,并实现M中定义的数据请求的接口
/ * Presenter层接口---控制Model层的数据操作及调用View层的UI操作来完成“中间人”工作. * 用于model和view的相关方法的调用 */ public class Presenter implements IPresenter, Model.LoadDataCallback {
private final IView mView; private final Model mModel; public Presenter(IView view) {
mView = view; mModel = new Model(); } @Override public void loadData() {
mView.showLoadingProgress("加载数据中"); mModel.getData(Presenter.this); } @Override public void success(String data) {
mView.showData(data); } @Override public void failure() {
} }
大家要多看,多试验,最重要的是理解思路,理解思路,理解思路。重要的事情说三遍。Google官方的MVP代码大家可以去研读一下,是同一个模式,只不过它把好多接口集成在一个接口文件中,防止代码碎片化,大家研读时记住这一点,就不会困惑了。
最后附上Google MVP的代码地址:
https://github.com/googlesamples/android-architecture/tree/todo-mvp/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201880.html原文链接:https://javaforall.net
