学习一下MVP模式
来源:互联网 发布:黑暗之光魔翼升阶数据 编辑:程序博客网 时间:2024/06/06 01:09
MVP与MVC相比:
MVP是从MVC模式演变过来的,MVC模式中,允许View和Model进行通信,而在MVP中则是完全交给了presenter来完成,并且通过接口实现完全解耦。
MVC和MVP图示比较,图片来源(http://blog.csdn.net/lmj623565791/article/details/46596109):
MVC和MVP各层的作用:
MVC:
- View:对应于布局文件
- Model:业务逻辑和实体模型
- Controllor:对应于Activity
MVP:
- View 对应于Activity,负责View的绘制以及与用户交互
- Model 依然是业务逻辑和实体模型
- Presenter 负责完成View于Model间的交互
MVP的优缺点:
优点:
- 降低耦合度
- 模块职责划分明显
- 利于测试驱动开发
- 代码复用
- 隐藏数据
- 代码灵活性
缺点:
- 增大代码量
看到很多人都是使用登录的功能来写MVP的,咱也不免俗了。
目录结构:
MVP书写步骤:
JavaBean是不可缺少的了,这里就简单写一个,Demo如果写的太复杂容易让不熟的人一头雾水,最后只会彻底放弃:
public class UserBean {public String name;public String password;}
model层的书写分为OnLoginListener,IUserModel和UserModel。
OnLoginListener担负着监听返回数据的作用,数据类型就是之前定义的UserBean.
public interface OnLoginListener {//UserBean就相当于网络请求回来的数据Beanvoid loginSuccess(UserBean user);void loginFailed();}
IUserModel将login方法暴露给presenter:
public interface IUserModel { void login(String name, String password, OnLoginListener onLoginListener);}
IUserModel的login方法由其子类UserModel帮其实现:
public class UserModel implements IUserModel {@Overridepublic void login(final String name, final String password, final OnLoginListener onLoginListener) { //模拟登录操作 new Thread(new Runnable() { @Override public void run() { try { //模拟请求网络的时间 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if ("tom".equals(name) && "123".equals(password)) { //将数据携带到View层,如果是网络请求就是返回来的数据 UserBean user = new UserBean(); user.name=name; user.password=password; onLoginListener.loginSuccess(user); } else { onLoginListener.loginFailed(); } } }).start();}}
model层已经完成了,现在该书写present层了,该层负责和view层(Activity/Fragment)进行交互。
首先提供一个接口负责和view层进行交互(包括获取数据和更新UI).
public interface IUserLoginPresenter {String getUserName();String getUserPassword();void toMainActivity(UserBean user);void showFailedError();void showLoading();void hideLoading();}
由其子类实现这些方法:
public class UserLoginPresenter {private IUserModel mIUserModel;private IUserLoginPresenter mIUserLoginView;private Handler mHandler = new Handler();//构造方法public UserLoginPresenter(IUserLoginPresenter iUserLoginView) { this.mIUserLoginView = iUserLoginView; this.mIUserModel = new UserModel();}public void login() { mIUserLoginView.showLoading(); mIUserModel.login(mIUserLoginView.getUserName(), mIUserLoginView.getUserPassword(), new OnLoginListener() { @Override public void loginSuccess(final UserBean user) { mHandler.post(new Runnable() { @Override public void run() { mIUserLoginView.toMainActivity(user); mIUserLoginView.hideLoading(); } }); } @Override public void loginFailed() { mHandler.post(new Runnable() { @Override public void run() { mIUserLoginView.showFailedError(); mIUserLoginView.hideLoading(); } }); } });}}
最后就是View层了,View层就是Activity,实现IUserLoginPresenter接口,实现未实现的方法。
public class LoginActivity extends AppCompatActivity implements IUserLoginPresenter {private EditText etLoginName, etLoginPassword;private Button btnLoginExc;private ProgressBar pbLoginProgress;private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etLoginName = (EditText) findViewById(R.id.et_login_name); etLoginPassword = (EditText) findViewById(R.id.et_login_password); btnLoginExc = (Button) findViewById(R.id.btn_login_exc); pbLoginProgress = (ProgressBar) findViewById(R.id.pb_login_progress); btnLoginExc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //执行login的方法 mUserLoginPresenter.login(); } });}@Overridepublic String getUserName() { return etLoginName.getText().toString().trim();}@Overridepublic String getUserPassword() { return etLoginPassword.getText().toString().trim();}@Overridepublic void toMainActivity(UserBean user) { Toast.makeText(this, "登陆成功,我是:"+user.name+",我的密码是:"+user.password, Toast.LENGTH_SHORT).show();}@Overridepublic void showFailedError() { Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();}@Overridepublic void showLoading() { pbLoginProgress.setVisibility(View.VISIBLE);}@Overridepublic void hideLoading() { pbLoginProgress.setVisibility(View.GONE);}}
如有错误和不妥,敬请指出,共同进步~
源码下载
0 0
- 学习一下MVP模式
- MVP模式学习
- MVP模式学习
- android:MVP模式学习
- Retrofit+MVP模式学习
- 初次学习MVP模式
- MVP模式学习笔记
- MVP模式的学习
- Android MVP模式学习
- Mvp模式学习中...
- SimpleNews- Android MVP模式学习
- 学习和认识mvp模式
- MVP设计模式初步学习
- Android MVP模式的学习
- 学习android的MVP模式
- MVP开发模式学习记录
- MVP(model,view Presenter) Pattern(模式) 学习
- Android学习笔记MVP模式框架
- tomcat+https协议的接口编写及客户端访问
- 安装cocoapods时出现错误 Operation not permitted
- 自定义排序,按字符串长度排序
- 机器学习实战中如何加载kNN模块
- Libsvm的安装使用--MATLAB总结
- 学习一下MVP模式
- linux下进度条
- Freemaker FTL指令常用标签及语法
- 代码很烂,所以离职?
- 高德地图在Fragment中展示,并实现定位功能
- 解决 A child container failed during start
- 快速原型设计工具--Axure RP
- Centos7系统修改主机名
- R语言学习笔记(二)