MVP 浅析
随着Android多年的发展和积累,其开发的架构模式也逐渐发展的多种多样。最近研究了下安卓开发的MVP模式。本文做下总结。和简单介绍。以及学习中demo。基础:MVC: Model-view-controllerMVP: Model-view-presenterView层: 视图层,包含界面相关的功能。如各种:Activity,Fragment,View.Presenter层:逻辑控制层,充当中
随着Android多年的发展和积累,其开发的架构模式也逐渐发展的多种多样。最近研究了下安卓开发的MVP模式。本文做下总结。和简单介绍。以及学习中demo。
##基础:
MVC: Model-view-controller
MVP: Model-view-presenter
View层: 视图层,包含界面相关的功能。如各种:Activity,Fragment,View.
Presenter层:逻辑控制层,充当中间人角色。用来隔离View层和Model层。
Model层:封装各种数据源信息。实体类。
Controller: 逻辑业务层。
##一,简单介绍:
###1,概念:
####1.1传统的mvc模式:
mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。
Mvc中:Model层和View层是直接相互通信的,而且Controller是基于行为的,可以被多个View共享。
其中MVC关系如图:

####1.2Mvp模式:
mvp是经典的mvc的延伸和改进,
Mvp中View层和Model并没有直接通信,而是通过中间人Presenter来间接通信的。Presenter和View以及model交互都是通过接口进行的。 通常View和Presenter是一对的,当然,复杂的View可能需要多个Presenter来共同处理,这些需要根据具体的业务需求而定。
关系图:
##2.LoginDemo:
1,demo逻辑:
2,
demo中:Presenter 持有modle 的引用:
view 持有 Presenter的 引用。 view
和modle 通过Presenter交互。
LoginActiivty.java:
/**
* 登录界面 view
* 实现 ILoginView Presenter 和 LoginActivity 通过接口交互。 并
*/
public class LoginActivity extends BaseActivity implements ILoginView{
private ProgressDialog preDialog;
// 初始化 登录数据控制器
private LoginPresenter loginPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
account.setText("zhaoqiang");
pwd.setText("zhaoqiang");
//初始化 控制器
loginPresenter = new LoginPresenter(this);
}
@OnClick(R.id.submit_btn)
public void submitBtnclick(){
String acc = account.getText().toString().trim();
String passWd = pwd.getText().toString().trim();
preDialog = ProgressDialog.show(this,"正在登录...",null);
//TODO 创建进度框:
loginPresenter.iLoginPrToLogin(acc,passWd);
}
/**
* 该方法 由 ILoginview 回调
*/
@Override
public void iLoginViewSuccess() {
preDialog.dismiss();
preDialog = null;
//登录 成功 处理ui数据
Toast.makeText(this,"登录成功",Toast.LENGTH_LONG).show();
startActivity(new Intent(this, MainActivity.class));
finish();
}
/**
* 该方法 由 ILoginview 回调
*/
@Override
public void iLoginViewFailed() {
//登录 失败 处理UI数据
preDialog.dismiss();
preDialog = null;
Toast.makeText(this,"登录失败,请验证账号密码",Toast.LENGTH_LONG).show();
}
@OnClick(R.id.cancel_btn)
public void cancelBtnclick(){
finish();
}
}
LoginPresenter.java:
数据控制器:
/**
*
* 登录的 数据控制器 实现登录数据控制器接口
* 实现逻辑业务
*
* 去登陆
* 登录成功 失败回调 实现数据回调 并将回调数据返回 View
*/
public class LoginPresenter implements ILoginPresenter,OnLoginFinishedListener {
//present 持有 view 和 modle 的 引用 modle 和View 通过p 交互
private ILoginView view;
private AsyncLoginTask task; //处理 异步任务
/**
* 将 当前的需要处理的View 传进来 这边用于回调处理数据
* @param loginView 需要处理的View 实现 ILoginView 接口
*/
public LoginPresenter(ILoginView loginView) {
this.view = loginView;
this.task = new AsyncLoginTask(); //创建 异步任务类
}
/**
* 去登陆 传入 账号密码 将当前类作为 回调类
* @param username 账号
* @param password 密码
*/
@Override
public void iLoginPrToLogin(String username, String password) {
//执行 异步任务: 请求数据 将this 作为监听器
task.validateCredentAsync(this,new UserBean(username,password));
}
@Override
public void onLoginFishedLisSuccess() {
view.iLoginViewSuccess();
}
@Override
public void onLoginFishedLisError() {
view.iLoginViewFailed();
}
}
本例子 只是实现了 简单的 登录界面,并没有真正实现网络数据访问。对于modle的封装也比较简化。需要看源码的同学请移步github。
https://github.com/zqHero/MyMvpDemo
若想看完整版的mvpdemo:请移步下面:
完整版的实例:使用retrofit+butterknife+mvp : modle 也进行了完整封装:
https://github.com/zqHero/Mvp-demo2 欢迎fork 或 star.
参考:Android-高级进阶,顾浩鑫 一书(电子工业出版社)
感谢:https://github.com/jpotts18 android-mvp 代码。
更多推荐


所有评论(0)