所谓MVP就是视图,控制逻辑,数据的三者的分离,但是分离后我们还需要“控制逻辑层”P操作M(数据层)或V层(视图层),
这就需要每一层都实现一个接口,以方便其他层的调用。不理解的童鞋直接看下面代码。(MVP的详细概念百度之,这里不再赘述)

上面的图片展示的是登录模块的MVP目录结构,每层的实现类都继承了该层的接口。登录功能如下图:

当用户点击登录时,会显示出一个Progressbar,根据返回结果用吐司显示登录成功与否,并隐藏Progressbar;或者点击清空,清空填写的信息。

1.V

LoginView
// View层的接口主要声明V都可以做有关视图的哪些操作
public interface LoginView {public void onClearText();public void onLoginResult(Boolean result, int code);public void onSetProgressBarVisibility(int visibility);
}
LoginActivity
// 实现接口后只实现视图的最终显示效果,不做何时要执行切换视图效果的逻辑判断,逻辑判断交由P层实现
public class LoginActivity extends BaseActivity implements LoginView {/*各种视图组件*/private ProgressBar pb_login ;private AutoCompleteTextView et_user ;private EditText et_pw ;private Button bn_login , bn_clear ;/*P层*/LoginPresenter loginPresenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);initView() ;// 初始化P层loginPresenter = new LoginPresenterImpl(this) ;setListeners() ;}public void setListeners(){bn_login.setOnClickListener(onSingleClickListener);bn_clear.setOnClickListener(onSingleClickListener);}/*这个是为了防止多次点击封装的一个OnClickListener具体见http://blog.csdn.net/niuzhucedenglu/article/details/51373187*/private final OnSingleClickListener onSingleClickListener = new OnSingleClickListener() {@Overrideprotected void onSingleClick(View v) {switch (v.getId()){case R.id.bn_clear:// 清理的具体逻辑交由P层处理loginPresenter.clear();break;case R.id.bn_login:loginPresenter.setProgressBarVisiblity(View.VISIBLE);bn_login.setEnabled(false);bn_clear.setEnabled(false);// 登录的具体逻辑交由P层处理loginPresenter.doLogin(et_user.getText().toString(), et_pw.getText().toString());break;}}} ;public void initView(){pb_login = (ProgressBar) findViewById(R.id.pb_login) ;et_user = (AutoCompleteTextView) findViewById(R.id.et_user) ;et_pw = (EditText) findViewById(R.id.et_pw) ;bn_clear = (Button) findViewById(R.id.bn_clear) ;bn_login = (Button) findViewById(R.id.bn_login) ;}@Overridepublic void onClearText() {et_user.setText("");et_pw.setText("");}@Overridepublic void onLoginResult(Boolean result, int code) {loginPresenter.setProgressBarVisiblity(View.GONE);bn_login.setEnabled(true);bn_clear.setEnabled(true);if (result){ToastUtils.shortToast("Login Success");}else{ToastUtils.shortToast("Login Fail");}}@Overridepublic void onSetProgressBarVisibility(int visibility) {pb_login.setVisibility(visibility);}}

2.P

LoginPresenter
public interface LoginPresenter {void clear();void doLogin(String name, String passwd);void setProgressBarVisiblity(int visiblity);
}
LoginPresenterImpl
public class LoginPresenterImpl implements LoginPresenter {LoginView iLoginView;User user;Handler handler;// 用来模拟登录public LoginPresenterImpl(LoginView iLoginView) {this.iLoginView = iLoginView;initUser();handler = new Handler(Looper.getMainLooper());}@Overridepublic void clear() {iLoginView.onClearText();}@Overridepublic void doLogin(String name, String passwd) {Boolean isLoginSuccess = true;final int code = user.checkUserValidity(name,passwd);if (code!=0) isLoginSuccess = false;final Boolean result = isLoginSuccess;/*** 模拟登录过程*/handler.postDelayed(new Runnable() {@Overridepublic void run() {iLoginView.onLoginResult(result, code);}}, 3000);}@Overridepublic void setProgressBarVisiblity(int visiblity){iLoginView.onSetProgressBarVisibility(visiblity);}// 这里存储的是用于和输入比较的用户名和密码private void initUser(){user = new UserModel("mvp","mvp");}
}

3.M

User
public interface User {int checkUserValidity(String user , String pw) ;
}
UserModel
public class UserModel implements User {private String user , pw ;public UserModel(String user , String pw){this.user = user ;this.pw = pw ;}@Overridepublic int checkUserValidity(String user, String pw) {if(this.user.equals(user) && this.pw.equals(pw)){return 0 ;}return 1;}
}
每一层都有接口的另一个好处是:测试的时候只需要关心每一层接口的实现,而不需要关注其他代码。
例如:测试P层的控制逻辑只需要在LoginPresenterImpl 中修改代码即可,而不需要修改LoginActivity中的代码,
当LoginActivity界面的功能比较复杂有多个Presenter时,这种只修改某一个Presenter来验证逻辑是否正确的方法,无疑是高效且逻辑清晰的。

一个demo理解什么是MVP相关推荐

  1. 用一个demo理解一下Flutter动画内部的代码流程

    先上代码: import 'package:flutter/material.dart';void main() {runApp(MaterialApp(home: Material(child: S ...

  2. 一个DEMO让你彻底理解线程池

    目录 一.简介 二.线程池任务场景 场景一:提交5个任务,执行总耗时500ms 场景二:提交10个任务,执行总耗时500ms 场景三:提交11个任务,执行总耗时1000ms 场景四:提交20个任务,执 ...

  3. 一个demo让你彻底理解线程池工作流程

    网上关于线程池的八股文太多了我不多说,说了你也记不住,记住了也理解不了,理解了也不会用- 想了很久,终于想出一个demo,加上十个场景,让你能逐步理解线程池真正的工作流程 相信我,认真看完这篇文章,你 ...

  4. .NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯

    最近一段时间有些事情耽搁了更新,抱歉各位了. 上一篇我们简单的介绍了DotNetty通信框架,并简单的介绍了基于DotNetty实现了回路(Echo)通信过程. 我们来回忆一下上一个项目的整个流程: ...

  5. NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯

    最近一段时间有些事情耽搁了更新,抱歉各位了. 上一篇我们简单的介绍了DotNetty通信框架,并简单的介绍了基于DotNetty实现了回路(Echo)通信过程. 我们来回忆一下上一个项目的整个流程: ...

  6. 读懂一个 demo,入门机器学习

    我们总有一种感觉,机器学习门槛高.难入门.这是因为这里有太多晦涩的概念「神经网络」.「评估指标」.「优化算法」等让初学者老是有种盲人摸象的感觉.甚至连理解一个 Tensorflow 官方 Demo 都 ...

  7. 一个Demo带你手把手进行Docker开发(内涵源码和视频讲解)

    微软.NET20周年特别活动盛大开启,51Aspx联合微软官方打造了一场的"云原生开发挑战赛",在这里大家可以聆听大牛的直播讲座.进行现场互动..NET专家答疑解惑,还可报名参加. ...

  8. 鸿蒙系统开发app入门系列-- 第一个demo

    建了一个QQ交流群:492306415 当脉脉上全是dis鸿蒙系统的时候,我已经做完了第一个demo app,毛主席说过没有调查就没有发言权,与其坐而论道不如行而起之,来通过第一个app,感受一下鸿蒙 ...

  9. 斯坦福大学马腾宇:无法理解现有的深度学习算法?那就设计一个能理解的

    2020-01-22 05:41:34 作者 | 丛末 编辑 | Camel 本科毕业于清华姚班.博士毕业于普林斯顿大学,师从 Sanjeev Arora 教授,马腾宇作为 AI 学界一颗冉冉升起的新 ...

  10. java demo在哪里下载_[Java教程]Java学习 (一)、下载,配置环境变量,第一个demo...

    [Java教程]Java学习 (一).下载,配置环境变量,第一个demo 0 2016-03-01 22:00:18 一.在 http://www.oracle.com 下载java JDK 安装到自 ...

最新文章

  1. Python笔记总结week3
  2. js中判断两个数字的大小
  3. 07-Armv8-A virtualization
  4. 科大星云诗社动态20201123
  5. 数据结构--队列Queue--循环顺序队列
  6. wordpress使用 ftp使用问题总结
  7. 一文透析 Spring Boot、微服务架构和大数据治理三者之间的故事
  8. 完了!CPU 一味求快出事儿了!| 原力计划
  9. 计算机视觉(二)——深度学习进阶
  10. JavaSE| 面向对象-类的五大成员
  11. 紧急救援 L2-001 dijkstra 打印路径 最短路条数 权值
  12. 诺基亚E63凤凰刷机实战
  13. b85主板装服务器系统,华硕b85主板装不上win7怎么办
  14. 手机聊天记录备份与恢复的方法汇总
  15. 2019计算机世界语言排名,2019程序语言排行_2019 年 8 月编程语言排行榜
  16. 格(Lattice)基础(一)
  17. 婚房布置清单 婚房布置图片大全 婚房布置效果图
  18. 职场新人应该如何培养项目管理的能力?
  19. 解决win10系统文件资源管理器一直未响应的问题
  20. linux和windows认证sssd,linux – 使用sssd和Active Directory集成的麻烦

热门文章

  1. 红帽操作系统 RHEL 8.1 官方ISO镜像下载
  2. MIT6.824-lab3AB-2022(万字推导思路及代码构建)
  3. ssh-keygen -t rsa详解
  4. golang gin框架全局捕获500和404
  5. vue和 element ui下载到本地后引入
  6. SQL 已死,NoSQL才是王道?醒醒吧,别瞎说八道了
  7. 使用 dfuse 无缝过渡到 EOSIO 1.8
  8. 图表和文字等元素在电子大屏下变形的解决方案
  9. python实现Ensembl ID和gene symbol的相互转换
  10. Violent python - UNIX Password CrackerZipfile Password Cracker