Android MVP模式的初识
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();
}
public interface ILoginPresenter {
void doLogin(String username, String password);
void clear();
void onDestroy();
}
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模式的初识的更多相关文章
- android MVP模式介绍与实战
android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...
- Android MVP模式
转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...
- Android MVP模式 简单易懂的介绍方式
主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200
- Android MVP模式简单易懂的介绍方式 (三)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 讲完M和P,接下来就要讲V了.View ...
- Android MVP模式简单易懂的介绍方式 (二)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 上一篇文章我们介绍完了Model的创建 ...
- Android MVP模式简单易懂的介绍方式 (一)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...
- Android MVP模式 谷歌官方代码解读
Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...
- Android mvp模式、mvvm模式
MVC和MVP的区别2007年08月08日 星期三 上午 09:23 MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会 ...
- Xamarin.Android MVP模式
一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只 ...
随机推荐
- redhat 6.5 使用其它Linux镜像源的yum源
最近在虚拟机里装了rhel_6.5_x86_64,发现竟然不自带g++,没办法只好 “yum install gcc-c++”,无奈失败,原因是redhat的yum是收费的... 于是打算怒装其它免费 ...
- App架构经验总结(转)
原文链接: http://keeganlee.me/post/architecture/20160303 架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构 ...
- nginx + memcached-session-manager 实现tomcat下的负载均衡
1. tomcat6.0 配置 memcached-session-manager 实现session共享 1.1 下载memcached-session-manager-1.6.5.jar.memc ...
- A. Difference Row
A. Difference Row time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- python 实现对象模型
# -*- coding:utf-8 -*- """ python 实现对象模型 创建 bmicalcpage 类 """ class bm ...
- 算法 python实现(二) 冒泡排序
首先说一下 冒泡排序 是怎么做的: 总体的想法是,把小的轻的浮上前面去,把大的重的沉到后面去. 这样设置两个指针,i j, 1. i标识每一趟循环.这一趟的目的是把后面那些未排序的数列中最小的浮上前面 ...
- 安装windows系统(win7)
又到了清理电脑,重装系统的时候了.最近被自己电脑折腾得不清,特记录下安装心得,以方便以后. 分区考虑(35G+40G) 35G=16G+4G+5G+10G,其中16G是64位官方旗舰版WIN7刚安装好 ...
- HW4.18
public class Solution { public static void main(String[] args) { System.out.println("Graph 1&qu ...
- 4 weekend110的hive入门
查看企业公认的最新稳定版本: https://archive.apache.org/dist/ Hive和HBase都很重要,当然啦,各自也有自己的替代品. 在公司里,SQL有局限,大部 ...
- STM32 IAP 在线更新程序 为什么有时行 有时又不行 感觉不可靠 问题解决
搞了一天才发现 在MDK设置选项中有个"linker"选项卡 , 需要在Project->Options->Linker中将Use Memory Layout from ...