MVP是什么?或许在之前更多的人知道的是MVC这个模式(Model View Controller),然而MVP与MVC最不同的一点是M与V是不直接

  关联的也是就Model与View不存在直接关系,这两者之间间隔着的是Presenter层。个人感觉这是一种很棒的设计,让代码能够实现充分的解耦。

    那么我们还是没有讲到MVP是什么~~~不要急,我会用最简单的方式来叙述,这样好理解~

    

    M(Model):为UI层提供数据,或者是保存UI层的数据;

    V(View) :单纯的数据展示,响应用户的操作并且都转发给Presenter来做具体的处理;

    P(Presenter):逻辑控制层,从Model处取数据,运算和转化,最后用View来展示;并处理View传过来的用户事件,并做处理;

    是不是觉得一目了然了呢~很多第一次学习设计模式的都会有一个这样的疑问,就是设计模式这种东西听上去好像很高大上,那么在什么情

  况下我们就应该使用MVP这种设计模式呢?其实:

  •   基本上都可以,哪怕只有一个登录的功能,也都是可以使用MVP的,我们初学MVP肯定目标是学习,所以以掌握知识为重,等到理解了,大的项目就      可以使用了;
  •   MVP它是一个方法论的东西,没有固定的实现方式,只要能体现出它的方法就可以算是MVP。

    当然,我们上述所说的感觉给人一点华而不实的感觉,毕竟就这么说谁也不知道MVP到底怎么用,还是要有一点点小规则反而会比较好让我们

  去理解: 

  • Model与View不能直接通信,只能通过Presenter
  • Presenter类似于中间人的角色进行协调和调度
  • Model和View是接口,Presenter持有的是一个Model接口和一个View接口
  • Model和View都应该是被动的,一切都由Presenter来主导
  • Model应该把与业务逻辑层的交互封装掉,换句话说Presenter和View不应该知道业务逻辑层
  • View的逻辑应该尽可能的简单,不应该有状态。当事件发生时,调用Presenter来处理,并且不传参数,Presenter处理时再调用View的方法来获取。

  我们很容易看出,关键的地方还是在Presenter上面,可以说Presenter就是我们整个MVP设计模式的核心部分,那么理论上说了这么多,具体怎么落实呢?

  在Android中的实现

    

    MVP是一个方法论的东西,也就是没有任何固定的具体的实现形式,只要能够把View跟Model解除联系,把逻辑都放在Presenter中,那么就能算

  得上是MVP,一些具体的实践的指导性原则:

  • View是一个接口,负责被动的把处理好的数据显示出来
  • Model也是一个接口,负责获取数据和存储数据
  • View调用Presenter处理用户事件也是一个接口,称为事件Delegate
  • Presenter持有的是View的接口和Model接口

  接下来我们使用一个登陆的例子来说明:

  登陆View的接口: 

public interface ILoginView {
void clearEditText(); void showProgress(); void hideProgress(); void setUsernameError(); void setPasswordError(); String getUsername(); String getPassword(); void loginSuccess(); }
登陆Presenter接口:
public interface ILoginPresenter {
void doLogin(String username, String password); void clear(); void onDestroy();
}
实现Presenter接口:
public class LoginPresenter implements ILoginPresenter {
private ILoginView mLoginView;
private User mUser; public LoginPresenter(ILoginView loginView) {
this.mLoginView = loginView;
initUser();
} private void initUser() {
mUser = new User(mLoginView.getUsername(), mLoginView.getPassword());
} @Override
public void doLogin(String username, String password) {
mLoginView.showProgress();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mLoginView.hideProgress();
int code = mUser.checkUserValidity(mLoginView.getUsername(), mLoginView.getPassword());
if (code == -1) {
mLoginView.setPasswordError();
} else if (code == 0) {
mLoginView.loginSuccess();
}
}
}, 2000);
} @Override
public void clear() {
mLoginView.clearEditText();
} @Override
public void onDestroy() {
mLoginView = null;
}
}

定义Model:

public class User {
private String username;
private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public User(String username, String password) {
this.username = username;
this.password = password;
} public int checkUserValidity(String username, String password) {
if (username == null || password == null ||
username.isEmpty() ||
password.isEmpty()) {
return -1;
}
return 0;
}
}

在Activity中实现view:

public class LoginActivity extends AppCompatActivity
implements ILoginView, View.OnClickListener { private ILoginPresenter mLoginPresenter; @Bind(R.id.et_username)
EditText etUsername;
@Bind(R.id.et_passwrod)
EditText etPasswrod;
@Bind(R.id.bt_enter)
Button btEnter;
@Bind(R.id.bt_clear)
Button btClear;
@Bind(R.id.progress)
ProgressBar progress; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mLoginPresenter = new LoginPresenter(this);
btEnter.setOnClickListener(this);
btClear.setOnClickListener(this);
} @Override
public void clearEditText() {
etPasswrod.setText("");
etUsername.setText("");
} @Override
public void showProgress() {
progress.setVisibility(View.VISIBLE);
} @Override
public void hideProgress() {
progress.setVisibility(View.GONE);
} @Override
public void setUsernameError() {
etUsername.setError("username error");
} @Override
public void setPasswordError() {
etPasswrod.setError("password error"); } @Override
public String getUsername() {
return etUsername.getText().toString();
} @Override
public String getPassword() {
return etPasswrod.getText().toString();
} @Override
public void loginSuccess() {
//start act Main
Toast.makeText(this, "login success", Toast.LENGTH_SHORT);
finish();
} @Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_clear:
mLoginPresenter.clear();
break;
case R.id.bt_enter:
mLoginPresenter.doLogin(etUsername.getText().toString(),
etPasswrod.getText().toString());
break;
}
} @Override
protected void onDestroy() {
mLoginPresenter.onDestroy();
super.onDestroy();
}
}

  这样一来是不是对MVP的理解就更加深刻了一点呢,如果没有看懂最好是自己动手敲一遍,会理解的更快哦~~~~~

Android MVP模式的初识的更多相关文章

  1. android MVP模式介绍与实战

    android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...

  2. Android MVP模式

    转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...

  3. Android MVP模式 简单易懂的介绍方式

    主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200

  4. Android MVP模式简单易懂的介绍方式 (三)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 讲完M和P,接下来就要讲V了.View ...

  5. Android MVP模式简单易懂的介绍方式 (二)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...

  6. Android MVP模式简单易懂的介绍方式 (一)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...

  7. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  8. Android mvp模式、mvvm模式

    MVC和MVP的区别2007年08月08日 星期三 上午 09:23 MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会 ...

  9. Xamarin.Android MVP模式

    一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只 ...

随机推荐

  1. HDU-2551 竹青遍野

    http://acm.hdu.edu.cn/showproblem.php?pid=2551 妙用for循环. 竹青遍野 Time Limit: 2000/1000 MS (Java/Others)  ...

  2. 【转】.NET 三层架构 中 DAL+IDAL+Model+BLL+Web

    其实三层架构是一个程序最基本的 在.Net开发中通常是多层开发 比如说 BLL 就是business Logic laywer(业务逻辑层) 他只负责向数据提供者也就是DAL调用数据 然后传递给 客户 ...

  3. webscarab使用

    安装jdk-6u20-windows-i586.exe(需要java支持,bat里边就是用java执行的) 设置java环境变量,系统变量里配置 JAVA_HOME变量(默认已经设置好了). 运行 s ...

  4. input hidden用法

    之前获取数据传数据,都是写在全局变量里,今天老板告诉我说用input hidden来存,我百度了一下,确实是个好方法,记录之: 1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或 ...

  5. Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 833  Solved: 397[Submit][Status][D ...

  6. WORD文档的长串数字如何粘贴到excel

    有问题,才有提高 问题描述: 现 word 文档中有好多长长的数字(如下),我需要将它们弄进 Excel 中 直接[复制],[粘贴],结果显示如下: 然后再设置单元格格式中的数字,无论选哪一个都得不到 ...

  7. 打印从1到k之间的所有素数

    问题分析:素数是指大于1且只能被它本身和1整除的数,根据定义可以从2开始对一个数取余数一直到它本身,若它有第三个整除数,则可以判定它不是素数.若使用这种方法,会浪费时间,我们可以判断2到这个数的算术平 ...

  8. PG数据库之间的导入导出

    本文将介绍如何对PG数据库进行导入.导出,主要利用的是PG自带的pg_dump.pg_dumpall.pg_restore.psql等命令,版本是9.4(不同版本的pg_dump \ pg_resto ...

  9. java小算法—大衍数列

    题目:    中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理. 它的前几项是:0.2.4.8.12.18.24.32.40.50 ... 其规律是:对偶数项,是序号平 ...

  10. thinkphp实现模糊匹配(学习贵哥代码)

    模板文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...