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. 【canvas】伸缩 / 剪裁 / 文本 / 阴影 / 填充图案 / 填充渐变

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  2. input框自动填充内容背景颜色为黄色解决方法

    谷歌浏览器input自动填充内容,背景色会是黄色,想改的话: input:-webkit-autofill { box-shadow: 0 0 0px 1000px white inset;} 这种方 ...

  3. Unity给力插件之Final IK

    Final IK细节: 1.Aim IK:设定一个目标,关节末端始终朝向该目标,一般用来做头部的朝向. 步骤: a.在模型头节点处添加Aim空物体并reset b.给模型添加Aim IK组件,并填上A ...

  4. python进度1

    Python 错误和异常 异常参数: 3.4与2.7有些不同 3.4中 try: x except NameError as e: print(type(e)) print(e) 运行结果: < ...

  5. nopCommerce_3.00-Nop.Core.Caching

    namespace Nop.Core.Caching { /// <summary> /// Cache manager interface /// </summary> pu ...

  6. sql date 的精度问题

    new  java.sql.Date(...) 是经过yyyy-MM-dd 格式化后的时间格式. 如果需要:HH:mm:ss .则要用 new java.sql.Timestamp(.....);

  7. poj 2079 Triangle(旋转卡壳)

    Triangle Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 8917   Accepted: 2650 Descript ...

  8. HTML5与CSS3权威指南.pdf2

    第三章 HTML5的结构 article元素更强调独立性,section元素强调分段,div元素强调css的套用,aretcle元素和section元素在核实的情况下可以调换 nav元素用作页面导航的 ...

  9. Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1539  Solved: 665[Submit][Status][Di ...

  10. CMake 入门实战 | HaHack

    CMake 入门实战 | HaHack undefined