原文链接 http://sparkyuan.me/ 转载请注明出处

MVP

介绍

MVP模式(Model-View-Presenter)是MVC模式的一个衍生。

主要目的是为了解耦,使项目易于维护。

  • Model 依旧是业务逻辑和实体模型
  • View 常常由Activity实现,包括Presenter的引用。所要做的就是当有交互时。调用Presenter里的相应方法。

  • Presenter 负责完毕View于Model间的交互。从Model里取数据,返回给View处理好的数据。

为什么使用MVP

在以往的Android开发中,Activity并非一个标准的MVC模式中的Controller, 它的载入应用的布局和初始化用户界面,接受并处理来自用户的操作请求,进而作出响应。可是随着界面及其逻辑的复杂度不断提升,Activity类的职责不断添加,以致变得庞大臃肿。当我们将当中复杂的逻辑处理移至另外的一个类(Presneter)中时,Activity事实上就是MVP模式中View。它负责UI元素的初始化,建立UI元素与Presenter的关联(Listener之类)。同一时候自己也会处理一些简单的逻辑(复杂的逻辑交由Presenter处理)。

对于測试来说。在MVP模式中,处理复杂逻辑的Presenter是通过interface与View(Activity)进行交互的。

我们能够通过自己定义类实现这个interface来模拟Activity的行为对Presenter进行单元測试。省去了大量的部署及測试的时间。

MVC介绍

  • Model 是应用程序中用于处理应用程序数据逻辑的部分。

  • View 是应用程序中处理数据显示的部分。
  • Controller是应用程序中处理用户交互的部分。

    详细介绍请戳这里

比較

MVP模式:

  • View不直接与Model交互 。而是通过与Presenter交互来与Model间接交互
  • Presenter与View的交互是通过接口来进行的,更有利于加入单元測试
  • 通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑

MVC模式:

  • View能够与Model直接交互
  • Controller是基于行为的,而且能够被多个View共享
  • 能够负责决定显示哪个View

演示样例

一个登陆注冊的样例。

文件夹结构

Model

Model为User的信息,项目里省略了。当然你也能够新建一个User类

  1. public class UserBean {
  2. private String mFirstName ;
  3. private String mLastName ;
  4. public UserBean (String firstName, String lastName) {
  5. this .mFirstName = firstName;
  6. this .mLastName = lastName;
  7. }
  8. public String getFirstName() {
  9. return mFirstName ;
  10. }
  11. public String getLastName() {
  12. return mLastName ;
  13. }
  14. }

View

  1. public class LoginActivity extends Activity implements LoginView, View.OnClickListener {
  2. private ProgressBar progressBar;
  3. private EditText username;
  4. private EditText password;
  5. private LoginPresenter presenter;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_login);
  10. progressBar = (ProgressBar) findViewById(R.id.progress);
  11. username = (EditText) findViewById(R.id.username);
  12. password = (EditText) findViewById(R.id.password);
  13. findViewById(R.id.button).setOnClickListener(this);
  14. presenter = new LoginPresenterImpl(this);
  15. }
  16. @Override public void onClick(View v) {
  17. presenter.validateCredentials(username.getText().toString(), password.getText().toString());
  18. }
  19. ...
  20. ...

能够看到LoginActivity implements了两个接口。LoginView, View.OnClickListener。LoginView是在Presenter中用来与Activity通信的。在onClick()方法中调用了presenter进行事务处理。

LoginView.java

  1. public interface LoginView {
  2. void showProgress();
  3. void hideProgress();
  4. void setUsernameError();
  5. void setPasswordError();
  6. void navigateToHome();
  7. }

Presenter

  1. public class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener {
  2. private LoginView loginView;
  3. private LoginInteractor loginInteractor;
  4. public LoginPresenterImpl(LoginView loginView) {
  5. this.loginView = loginView;
  6. this.loginInteractor = new LoginInteractorImpl();
  7. }
  8. @Override public void validateCredentials(String username, String password) {
  9. if (loginView != null) {
  10. loginView.showProgress();
  11. }
  12. loginInteractor.login(username, password, this);
  13. }
  14. @Override public void onUsernameError() {
  15. if (loginView != null) {
  16. loginView.setUsernameError();
  17. loginView.hideProgress();
  18. }
  19. }
  20. ...
  21. ...

能够发现。在onUsernameError()方法中。把处理好的结果通过LoginView接口返还给Activity进行显示。

到此为止。整个流程就跑通了。M存储数据,V交互。P处理逻辑。

V和P之间通过接口通信。



演示样例源代码戳这里

原文链接 http://sparkyuan.me/ 转载请注明出处

Android中MVP模式与MVC模式比較(含演示样例)的更多相关文章

  1. 10分钟理解Android数据库的创建与使用(附具体解释和演示样例代码)

    1.Android数据库简单介绍. Android系统的framework层集成了Sqlite3数据库.我们知道Sqlite3是一种轻量级的高效存储的数据库. Sqlite数据库具有以下长处: (1) ...

  2. Android线程池(二)——ThreadPoolExecutor及其拒绝策略RejectedExecutionHandler使用演示样例

    MainActivity例如以下: package cc.vv; import java.util.concurrent.LinkedBlockingQueue; import java.util.c ...

  3. Android中关于JNI 的学习(四)简单的样例,温故而知新

    在第零篇文章简单地介绍了JNI编程的模式之后.后面两三篇文章,我们又针对JNI中的一些概念做了一些简单的介绍,也不知道我究竟说的清楚没有.但相信非常多童鞋跟我一样.在刚開始学习一个东西的时候,入门最好 ...

  4. Android中关于JNI 的学习(零)简单的样例,简单地入门

    Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...

  5. iOS中常见的设计模式——单例模式\委托模式\观察者模式\MVC模式

    一.单例模式 1. 什么是单例模式? 在iOS应用的生命周期中,某个类只有一个实例. 2. 单例模式解决了什么问题? 想象一下,如果我们要读取文件配置信息,那么每次要读取,我们就要创建一个文件实例,然 ...

  6. Django的MVT模式与MVC模式

    Django的MVT模式与MVC模式 在正式开始coding之前,我觉得有必要探讨下Django的MVT模式,理论和实践相结合,才能更好的掌握一门技术.Django中的MVT模式,Django就是属于 ...

  7. MVC模式编程演示样例-登录验证(静态)

    好,上篇博客分享了本人总结的JSP-Servlet-JavaBean三层架构编程模式的实现思想和基本流程,接下来给大家分享一个MVC编程模式的实现演示样例-登录验证的过程,这里我仍然用的是静态的验证u ...

  8. obj-c编程15[Cocoa实例03]:MVC以及归档化演示样例

    前面的博文里介绍了归档和解档,这里我们把它实际应用到一个简单的代码中去,将它作为一个多文档应用程序的打开和保存的背后支持.另外这里介绍一下MVC思想,这个在不论什么语言里都会有,它是一种设计思想,主要 ...

  9. android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理

    本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用 ...

随机推荐

  1. C#编程(四十八)----------列表

    C#中的List C#中deList怎么样?List<T>类是ArrayList类的泛型等效类,该类使用大小可按需动态增长的数组实现List<T>泛型接口. 泛型的好处:它为使 ...

  2. cvCreateStumpClassifier

    CV_BOOST_IMPL CvClassifier* cvCreateStumpClassifier( CvMat* trainData, //训练样本的数据,包含图像大小.数量,类别,权重等 in ...

  3. SSD阵列卡方案优化:考虑使用RAID 50替代RAID 10

    最近一直在研究RAID 50,因为牺牲一半的容量的RAID 10代价实在太大了,而且它提供的可用性也并不是百分百的,我们首先来看下RAID 10的可用性分析: 以同等容量的不同RAID方式作为案例分析 ...

  4. ios成长之每日一遍(day 2)

    接着下来简单说说Label(相当于android的textview)和button的使用, 由于都是与上篇的AppDelegate一致, 所以这一篇就说说ViewController与xib的使用呗. ...

  5. ExtJS 4.2 教程-06:服务器代理(proxy)

    转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-6-server-proxy ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 ...

  6. 无需SherlockActionbar的SlidingMenu使用详解(二)——向Fragment中添加ViewPager和Tab

    之前我们对大体框架有了一定的认识,现在我们来做Fragment界面,其实这里面和这个框架的关系就不大了,但因为有些同学对于在SlidingMenu中切换fragment还是有问题,所以我就在本篇进行详 ...

  7. 拦截器通过Spring获取工厂类,注入bean对象

    // 这里需要注意一点,我们在拦截器内无法通过SpringBean的方式注入LoggerJPA,我只能通过另外一种形式. /** * 根据传入的类型获取spring管理的对应dao * @param ...

  8. 获取客户端网卡MAC地址和IP地址实现JS代码

    获取客户端网卡MAC地址和IP地址实现JS代码 作者: 字体:[增加 减小] 类型:转载   获取客户端的一些信息,如IP和MAC,以结合身份验证,相信很多人都会这样做吧,我们这里用Javascrip ...

  9. 局部响应归一化(Local Response Normalization,LRN)

     版权声明:本文为博主原创文章,欢迎转载,注明地址. https://blog.csdn.net/program_developer/article/details/79430119 一.LRN技术介 ...

  10. 管道命令和xargs的区别

    一直弄不懂,管道不就是把前一个命令的结果作为参数给下一个命令吗,那在 | 后面加不加xargs有什么区别NewUserFF 写道:懒蜗牛Gentoo 写道:管道是实现“将前面的标准输出作为后面的标准输 ...