MVP模式使用示例详解

MVP模式使用示例详解什么是 MVP 模式 amp nbsp amp nbsp amp nbsp amp nbsp amp nbsp 这个 MVP 可不是腾讯游戏 王者荣耀 中的 MVP 我们今天要讨论的 MVP 其实同 MVC 一样 是一种编程模式和思想 也许更准确地讲是一种架构 amp nbsp MVP 和 MVC 的区别 amp nbsp

什么是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

(0)
上一篇 2026年3月20日 上午8:24
下一篇 2026年3月20日 上午8:24


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号