1.MVP模式的简介:

相对于mvc,mvp模式中p就是presenter的缩写,意思相当于主持人,它协调view和model的连接,view和model相当于是两个不认识的人,他们中间的中介就是presenter,p持有m和v两个的联系方式。view要处理页面就要要数据,就去找p,让p去拿数据。而p呢就会直接找m去要数据,m把数据给p,然后p拿着数据进行加工,然后给v有用的数据,来用于v的展示。这个过程很像我们通过中介找房子。中介有我们和出租房的联系方式,可以通过查询系统,获取到出租房的房源信息,然后给我们最后有用的信息,比如房屋价格,环境等。但是我们是和房东没有办法直接联系的。这就是mvp。而mvc的话v是可以持有model数据的,这就导致v可能会对model做数据修改。导致会掺杂一些业务逻辑。使得业务逻辑在m和c以及v中混杂到一起。这个典型的例子就是activity。既要控制显示,还要管理数据。非常混乱。而为了更好的分层,还有后续如果我换v和m都没有很大影响的话,我们就延伸出了mvp。就如那个中介,它可以换一套查询系统和房东信息,也可以换租户,但是实现的模式还是不变的。


2.MVP模式具体使用方法:

在项目中的使用:

我们通常需要以接口的形式来实现三者的关系,这样方便后续的扩展。

以登陆为例:

Model:

/**
 * 描述:登录界面请求接口
 *
 */
public interface LoginInteractor extends MvpInteractor {
    /**
     * 登录
     * @param phone
     * @param pwd
     * @param loginInteractorListener
     */
    void userLogin(String phone, String pwd, LoginInteractorListener loginInteractorListener);
    /**
     * 请求接口监听器
     */
    interface LoginInteractorListener {
        /**
         * 请求成功且业务代码 也成功
         */
        void succeed();

        /**
         * 请求成功,但是业务代码失败
         * @param message
         */
        void failed(String message);

        /**
         * 请求失败
         *
         * @param error
         */
        void connectFail(String error);
    }
}

View:

/**
 * 描述:
 * 作者:58 on 2016/5/11 10:41
 */
public interface LoginView extends MvpView {
    /**
     * 登录成功view显示
     */
    void loginSucceed();

    /**
     * 登录失败view显示
     * @param message
     */
    void loginFailed(String message);
    void showNotice(String message);
    /**     
    * 返回当前登录界面btn的状态 
    * @param canClick  
   */  
   void isCanClick(boolean canClick);
    void loadingDismiss();
}
    void showNotice(String message);

Presenter:

/**
 * 描述:登录界面逻辑控制器
 */
public interface LoginPresenter extends MvpPresenter<LoginView> {
    /**
     * 登录
     * @param phone
     * @param pwd
     */
    void login(String phone, String pwd, String validcode);
    /**
     * 检测是否可以点击登录btn
     * @param userPhone
     * @param password
     */
    void checkClickBtn(String userPhone, String password);
}
public interface MvpPresenter<T extends MvpView> {
/**
     * 将MVP的View附加到Presenter
     */
    void attachView(T view);
    void attachView(T view,ViewGroup rootView);
    void detachView();
}

具体的实现类如下:

/**
 * 描述:登录界面逻辑控制器实现
 */
public class LoginPresenterImpl implements LoginPresenter, LoginInteractor.LoginInteractorListener, GetPictureVerCodeInteractor.GetPictureVerCodeInteractorListener {
    private LoginView mLoginView;
    private Context mContext;
    private LoginInteractor mLoginInteractor;
    public LoginPresenterImpl(Context context) {
        mContext = context;
        mAccount = Account.getAccount(mContext);
    }
    @Override
    public void attachView(LoginView view) {
        mLoginView = view;
        mLoginInteractor = new LoginInteractorImpl(mContext);
    }
    @Override
    public void attachView(LoginView view, ViewGroup rootView) {    }
    @Override
    public void detachView() {
        mLoginInteractor.cancelAllRequest();
        mContext = null;
        mLoginView = null;
    }
    @Override
    public void login(String phone, String pwd, String validcode) {
        mLoginInteractor.userLogin(phone, pwd, this);
    }
    @Override
    public void checkClickBtn(String userPhone, String password) {
        boolean canClick = !userPhone.isEmpty() && userPhone.length() == 11 && !password.isEmpty() && password.length() >= 6;
        mLoginView.isCanClick(canClick);
    }
    @Override
    public void succeed() {
        mLoginInteractor.sendPPU(this);
    }
    @Override
    public void failed(String message) {
        mLoginView.loginFailed(message);
    }
    @Override
    public void connectFail(String error) {
        mLoginView.showNotice(error);
    }
    @Override
    public void requestFinish() {
        mLoginView.loadingDismiss();
    }
}

Model:

/**
 * 描述:登录界面请求接口实现类
 */
public class LoginInteractorImpl implements LoginInteractor {
    public Context mContext;

    public LoginInteractorImpl(Context context) {
        mContext = context;
    }
    @Override
    public void cancelRequest(String requestTag) {
        HttpManager.getHttpManagerBase(mContext).cancelRequest(requestTag);
    }
    @Override
    public void cancelAllRequest() {
        HttpManager.getHttpManagerBase(mContext).cancelRequest(ConstantConfig.LOGIN_TAG);
        mContext = null;
    }
    @Override
    public void userLogin(final String phone, final String pwd, final String validcode, final String vcodekey, final LoginInteractorListener loginInteractorListener) {
        final Map<String, String> map = setParams(phone, pwd, validcode, vcodekey);
        LogUtil.i("userlogin", map.toString());
        String url = "http://test/login;   //这里只做示例
        HttpManager.getHttpManagerBase(mContext).httpPost(url, map, ConstantConfig.LOGIN_TAG, new RequestResultListener() {
            @Override
            public void onSuccess(String info, Object tag) {
                Log.e("--------------", info);
                Gson gson = new Gson();
                LoginInfo loginInfo = gson.fromJson(info, LoginInfo.class);
                if (loginInfo != null) {
                    loginInteractorListener.succeed();
                }
                loginInteractorListener.requestFinish();

            }
            @Override
            public void onFail(String code, String msg, String info, Object tag) {

                loginInteractorListener.failed(msg);

                loginInteractorListener.requestFinish();
            }
            @Override
            public void connectFail(NetworkResponse error, Object tag) {
                LogUtil.i("wuba", "connectFail");
                loginInteractorListener.connectFail("网络异常请重试");
                loginInteractorListener.requestFinish();
            }
        });
    }
}

我们可以让我们的Activity实现View的接口即可。如下

@Override
}
public class LoginActivity extends BaseActivity implements LoginView {
     。。。。。此处隐去1000字
public void loginSucceed() {    ToastUtil.show(this, "登录成功");
    if (mDialog != null) {        dialogIsShow = false;
        mDialog.dismiss();
    }
    loginIntent();

}
@Override
public void loginFailed(String message) {    if (mDialog != null) {        mDialog.dismiss();
        dialogIsShow = false;
    }
    if (TextUtils.isEmpty(message)) {        message = "登陆异常,请稍后重试!";
    }
    ToastUtil.show(this, message);
}
@Override
public void showNotice(String message) {    ToastUtil.show(this, message);
}
@Override
public void isCanClick(boolean canClick) {    if (canClick) {        loginLoginButton.setBackgroundResource(R.drawable.wb_login_btn_xml);
        loginLoginButton.setClickable(canClick);
    } else {        loginLoginButton.setBackgroundResource(R.drawable.wb_unlogin_btn_xml);
        loginLoginButton.setClickable(canClick);
    }
}
@Override
public void loadingDismiss() {    qianguiAccountLoading.statusToNormal();
    qianguiAccountLoading.setVisibility(View.GONE);
}

以上的代码中删去了一部分和公司相关的字段和数据,只是给大家做一个示例,不要生搬硬套。v和m的书写完全看个人的业务需求。

当我们需要替换登陆页面,或者需要替换登陆方式时,这时就会发现我们只需要动View和model即可。p就可以完全保持不动。

如果大家有什么不理解的地方,也可以给我留言。

MVP模式在项目中的使用相关推荐

  1. 【知识必备】浅淡MVP在Android项目中的实战演习,让代码结构更简单~

    写在前面 讲道理,这次是真的笔者很久都没有更新 blog 了,主要最近维护的框架问题也是层出不穷,而且对技术交流群的解答也让我身心疲惫,所以在这里跟关注我的人说声抱歉,没有定期给你们带来福利,那么这里 ...

  2. MVP模式在Android中的应用(附UML高清大图,使用RecyclerView举例)

    传了一张图,图比较大,请移步下载:http://download.csdn.net/detail/u011064099/9266245 在看代码之前,首先简单看一下什么是MVP模式:http://ww ...

  3. JAVA调用接口简单封装,Mvp+Retrofit2+RxJava2 项目中使用的简洁封装

    Retrofit2 + RxJava2 是一个强大的组合,完成一系列网络请求 MVP当前用的很多的一种框架,Model+View+Presenter 本文记录了作者在项目中对 Retrofit2 + ...

  4. 梦之鬼索MVP模式在Android中的设计和实现

    想必大家都知道MVC和MVP,MVVM.今天就来探讨一下MVP在安卓中的设计和实现. 首先谈一个需求. 你的boss说,小明去给我写一个程序很简单我提供Person ID 你给我拿出Person的姓名 ...

  5. MVP模式在Android中的应用之图片展示选择功能的框架设计

    前言:虽然安卓出现的时间比其它平台软件比较晚,但是在我们的安卓开发中,一样可以使用我们所熟知的设计模式来给它一个合理.完善的结构,这样,才可以使我们在平常开发的时候减少冗余代码的发生,真正的提高效率. ...

  6. 传统MVP用在项目中是真的方便还是累赘?

    原文地址: http://www.jianshu.com/p/ac51c9b88af3 qq群:301733278 前言(最后奉上福利) 自从Google在去年放出MVP的官方Sample后,越来越多 ...

  7. Android 架构之路(4)责任链模式在项目中的实际使用

    文章目录 前言 责任链模式定义 UML 类图: Demo 实现方式一: UML 类图: Demo 实现方式二: 项目实践 实现方式一: 实现方式二: 总结 前言 责任链模式(职责链模式)的运用在项目中 ...

  8. android mvp模式例子_Android中mvp模式使用实例详解

    MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...

  9. 工厂模式 — 在项目中的用法

    很多工程都是有pc端和mobile端的,并且这里的mobile端并不是指移动端适应的效果,而是专门为mobile端编写的. 所以这样一个页面就会用到两套页面代码(pc端和mobile端),例如imoo ...

  10. MVP模式在Android实际项目中的应用和优化

    注:本文阅读需要对MVP模式有基本了解. MVP模式已经出现有很长一段时间了,但是火起来是这两年的事情. 关于MVP的概览,介绍,乃至于教程,Demo,实例,网上都有很多,我也有一篇文章专门收录了一些 ...

最新文章

  1. Mysql性能优化方案
  2. Guava包学习--EventBus
  3. php中的网络接口,php中的接口interface
  4. Linux Kernel中断下半部分实现的三种方式
  5. python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路
  6. [MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic通过全局配置配置主键生成策略
  7. atitit. applet 浏览器插件 控件 的环境,开发,提示总结o9o
  8. webStrom破解链接
  9. sql取字段前4位_SQL学习之旅(7)
  10. 安装centos后 启动mysqld显示mysqld: 未被识别的服务 解决方法
  11. 2019测试学习路线图,内附完整自学路线+视频+工具
  12. kafka从入门到精通:马士兵java集合
  13. 翟菜花:为什么说社区会是虚拟偶像驶向未来的新航标?
  14. 中文论文检索证明怎么开_作者如何拿到论文检索证明
  15. 互联网公司裁员,中年失业找不到工作,大龄程序员的出路在哪里
  16. 分布式数据库原理解析
  17. 免费注册个体户营业执照出证教程
  18. 惠普战66键盘win10亮度调节快捷键失灵的解决办法
  19. 【Hibernate步步为营】--最后的集合映射
  20. 计算机科技兴趣小组活动总结,科技兴趣小组的活动总结

热门文章

  1. keygen_Laravel随机密钥与Keygen
  2. 硬盘是计算机的 奥鹏,奥鹏计算机应用基础一教学内容.docx
  3. 愤怒的小鸟有PC版本了!
  4. element-ui 下载后本地使用
  5. ubuntu设置自动关机
  6. 光学系统像差的计算机模拟,XCCHJJ-B 光学系统像差传函焦距测量综合实验装置
  7. Unity中的角色属性芒星比例图
  8. vue根据获取的文件名显示文件服务器上的图片
  9. 拼多多店铺营业执照相关问题
  10. 新版Space数字藏品源码+NFT数字藏品系统