一、概述

MVP设计模式的前身是MVC,这个无需再议

在安卓工程中MVC对应关系如下:

Layout->View : 对应布局文件
Activity->Controller,View (其中activity分的并不是特别清楚)
各种业务逻辑实体类->Model

MVP的基本概念是:

MVP 指的是Model,View,Presenter(交互器/表示器),是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。

二、MVP和MVC的区别

MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。

给个图最能提现区别:

图的上半部分是MVP模式 -- 可以看出 View 和Model 并不直接交互, 而是通过presenter作为中间人去 协调工作。这么做的好处是使得代码更加清晰明了,分工明确。

图的下半部分是MVC模式 -- 控制器controller(Activity)直接操作了 view 以及Model,也就是说运行View 和Model直接通信了。

总结MVP和MVC的优缺点如下:

1:MVC允许 View 和 Model 直接通讯。
2:MVP 中,View和 Model 的交互都在Presenter 内部来完成
3:MVP 中,View 通常会抽象化出来一系列的接口。(面向接口编程)
4:MVP 相对于 MVC 而言,大大降低了耦合度(Activity 不再进行复杂的操作),层级更明显,更利于单元测试。
5:MVP 的缺点:类文件会爆炸(极具增加),有一定的学习成本。

三、MVP的设计原则 -- 怎么实现一个MVP设计模式?

1:一个 Activity对应一个 View (把activity当成MPV的view进行操作)
2:通常情况下,一个 View对应一个 Presenter,在业务复杂时,一个 View可对应多个 Presenter.
3.通常情况下将 View 与 Presenter抽象成接口。

四、例子

工程结构

MVP的 presenter 定义了业务逻辑实现, 它其实有 Model 和 View 交互完成的业务逻辑

然后在MainActivity中显示页面结果

**
* MVP 中的Activity 其实就相当于 页面 用来显示最终结果的
*
* 它直接 根据布局 控件 来操作 布局属性
*/
public class MainActivity extends AppCompatActivity implements UserView{ private Toolbar toolbar;
private ClearEditText etUserName;
private ClearEditText etPassword;
private Button btn;
private TextView tvResult; private UserPresenter userPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); userPresenter = new UserPresenterImp(this); initialize();
setSupportActionBar(toolbar);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//模拟网络延迟登陆
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
userPresenter.login();
}
},500); }
});
} @Override
public String getUserName() {
return etUserName.getText().toString();
} @Override
public String getUserPwd() {
return etPassword.getText().toString();
} @Override
public void onSuccess(UserBean userBean) {
tvResult.setText(userBean.address);
} @Override
public void onError() {
Toast.makeText(this,"用户名或者密码错误",Toast.LENGTH_SHORT).show();
} @Override
public void onUserNameError() {
etUserName.setError("用户名不能为空");//这个onError是在EditText窗口显示的
} @Override
public void onUserPwdError() {
etPassword.setError("密码不能为空");
} private void initialize() {
toolbar = (Toolbar) findViewById(R.id.toolbar);
etUserName = (ClearEditText) findViewById(R.id.etUserName);
etPassword = (ClearEditText) findViewById(R.id.etPassword);
btn = (Button) findViewById(R.id.btn);
tvResult = (TextView) findViewById(R.id.tvResult);
}
}
public class UserPresenterImp implements UserPresenter {
private UserView userView;
public UserPresenterImp(UserView userView){
this.userView = userView;
} @Override
public void login() {
String username = userView.getUserName();
String password = userView.getUserPwd();
if(TextUtils.isEmpty(username)){
userView.onUserNameError();
return;
}
if(TextUtils.isEmpty(password)){
userView.onUserPwdError();
return;
}
if("123".equals(username)&&"aaa".equals(password)){
String result = "{\n" +
" \"username\": \"zccq\",\n" +
" \"password\": \"1\",\n" +
" \"address\": \"中国\"\n" +
"}";
UserBean userBean = new Gson().fromJson(result, UserBean.class);
userView.onSuccess(userBean);
}else{
userView.onError();
}
}
}

运行效果图:

源码下载地址:https://yunpan.cn/cu7JQWCwLGLum (提取码:4195)

Android之MVP设计模式的更多相关文章

  1. Android MVC MVP

    从.NET的宠物商店到Android MVC MVP   1 一些闲话 记得刚进公司的时候,我们除了做常规的Training Project外,每天还要上课,接受各种技术培训和公司业务介绍.当时第一次 ...

  2. Android开发MVP模式解析

    http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...

  3. 《Android源码设计模式》学习笔记之ImageLoader

    微信公众号:CodingAndroid cnblog:http://www.cnblogs.com/angel88/ CSDN:http://blog.csdn.net/xinpengfei521 需 ...

  4. Android开发 MVP模式的规范记录(个人总结)

    前言 首先,这篇文章不在讲解什么是mvp模式,如果需要请自行搜索mvp模式文章了解.这个文章里我只记录mvp模式的创建和mvp各自层的界限.另外这个博客属于个人使用mvp模式后一些经验总结与记录.并不 ...

  5. [转] Android中的设计模式-备忘录模式

    转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫 ...

  6. Android中的设计模式之观察者模式

    参考 <设计模式:可复用面向对象软件的基础 >5.7 Observer 观察者 对象行为型模式 <设计模式解析> 18.4 Observer模式 <Android源码设计 ...

  7. 通过TodoList案例对比Vue.js的MVVM设计模式与JQuery的MVP设计模式

    Vue MVVM设计模式: 在使用vue进行编程时,不会再涉及到DOM的操作,取而代之的是修改数据层,当把数据进行变更的时候,vue之中它的底层会自动的根据数据的不同帮助我们去重新渲染页面. 编码时不 ...

  8. android的MVP模式

    MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...

  9. Android经常使用设计模式(二)

    继上一篇 Android经常使用设计模式(一)里认识了观察者.适配器.代理等三种模式,这一篇将会解说下面三种模式: 工厂模式 单例模式 命令模式 1.工厂模式(Factory Pattern) 工厂模 ...

随机推荐

  1. 记一次解决tomcat自动关闭的bug

    最近一个运行了4年的javaee web项目,经常接到客户反馈系统无法打开.登录服务器查看服务,发现是tomcat自动关闭了.基本是3到4天发生一次. 运维人员开始以为是其他服务杀死了tomcat服务 ...

  2. 强烈推荐优秀的Vue UI组件库

    Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正 ...

  3. 爱奇艺JAVA后台面经

    链接:https://www.nowcoder.com/discuss/217425 1.volatile关键字的含义 2.Java NIO 讲一下 2.1 NIO selector,epoll的区别 ...

  4. 信安周报-第02周:SQL基础

    信安之路 第02周 Code:https://github.com/lotapp/BaseCode/tree/master/safe 前言 本周需要自行研究学习的任务贴一下: 1.概念(推荐) 数据库 ...

  5. [Spring cloud 一步步实现广告系统] 22. 广告系统回顾总结

    到目前为止,我们整个初级广告检索系统就初步开发完成了,我们来整体回顾一下我们的广告系统. 整个广告系统编码结构如下: mscx-ad 父模块 主要是为了方便我们项目的统一管理 mscx-ad-db 这 ...

  6. NOIP前的模板复习和注意事项

    联赛除去今天刚好只有一个星期了,最后一个星期也很关键,要吃好睡好保持心情愉悦.当然也免不了最后的复习计划. 首先是模板,之前还有很多模板没有复习到,这些东西是一定要落实到位的. 每天往后面写一点... ...

  7. 打印机服务配置篇WindowsServer2008

    本次配置Server2008 打印服务器    目的实现Kingdee远程打印服务,直接在金蝶客户端部署打印机服务器 服务器角色: --打印服务器 --LPD服务 --Internet打印 *打印服务 ...

  8. .net测试篇之Moq行为配置

    系列目录 我们前面说过.Moq在创建模拟对象的时候,简单对象赋值默认值,引用对象赋值为null,但是有些时候接口里面还包含另一个接口对象,我们知道Moq是可以模拟一个接口对象的,我们可以通过配置让Mo ...

  9. YARN底层基础库

      YARN基础库是其他一切模块的基础,它的设计直接决定了YARN的稳定性和扩展性,YARN借用了MRV1的一些底层基础库,比如RPC库等,但因为引入了很多新的软件设计方式,所以它的基础库更多,包括直 ...

  10. Egret白鹭开发小游戏中容易犯的错

    在游戏开发过程中遇到问题,请首先查阅:http://developer.egret.com/cn/github/egret-docs/Engine2D/minigame/minigameFAQ/ind ...