MVP概念
- M : Model(负责存储、检索、操纵数据)
- V : View(负责绘制UI元素,与用户进行交互)
- P : Presenter (是连接Model 和 View 的桥梁)
MVP的作用
- 将视图逻辑和业务逻辑分离开来,降低耦合
- Activity只处理声明周期的任务
- 提高代码的阅读性
- Presenter被抽象成接口,有多种具体的实现方式
- 业务逻辑在Presenter中,避免Activity造成内存泄露
MVP的核心思想
- 将Activity中的视图逻辑抽象成View接口,将业务逻辑抽象成Presenter接口
MVP的使用
- 根据谷歌官方的mvp写法,以下将用一个用户登录的demo来讲解。
- github地址:https://github.com/jwllls/MVPDemo.git
- 步骤如下
- 创建BaseView,BasePresenter
- 创建LoginContract(创建View 和 presenter,在其中声明方法 )
- 创建LoginPresenter(继承Contract 中的 Presenter,具体实现其中的方法)
- 创建LoginModel(具体实现数据逻辑,如请求网络数据,数据库中的数据等)
Demo代码说明
项目架构

BaseView
public interface BaseView<T> {
void setPresenter(T presenter); //该方法用于绑定View
}
BasePresenter
public interface BasePresenter {
void onStart(); //用来进行初始化工作
}
LoginContract
public class LoginContract {
public interface View extends BaseView<Presenter> {
//这里可以定义与 View 相关的方法
void showLoading(); // 显示加载
void dismissLoading(); // 隐藏加载
void toastSucMsg(); // 提示登录成功消息
void toastFailMsg();// 提示登录失败
}
public interface Presenter extends BasePresenter {
// 这里可以定义逻辑相关的方法,如请求网络数据或本地数据库的数据等。
void userLogin(String username, String password); // 定义一个登录方法, 模拟用户请求网络数据进行登录
}
}
LoginModel
public class LoginModel {
//在Model中进行具体的数据操作,如请求网络数据或请求数据库的数据等等。
/**
* 在这定义一个获取用户对象的方法
*/
public User getUser() {
//假设从服务器上获取到的对象是User,用户名和密码分别是admin和12345
User user = new User();
user.setUsername("admin");
user.setPassword("12345");
return user;
}
}
LoginPresenter
public class LoginPresenter implements LoginContract.Presenter {
private LoginContract.View view;
private UserModel model; //用于数据的处理,如网络请求、数据库请求等
private Activity activity;
public LoginPresenter(LoginContract.View view, Activity activity) {
this.view = view;
this.activity = activity;
view.setPresenter(this); //在构造方法中将 Presenter 和 View 绑定
model = new UserModel(); //创建UserModel对象
}
@Override
public void onStart() {
// userLogin 可以在onStar( )进行初始化方法
}
@Override
public void userLogin(String username, String password) {
User user = model.getUserModel(); //模拟获得网络请求返回的用户数据
view.showLoading(); //显示加载窗
if (user.getUsername().equals(username) && user.getPassword().equals(password)) { //加入账号密码正确则登录成功
new Handler().postDelayed(new Runnable() { //延迟2秒后执行
@Override
public void run() {
view.toastSucMsg(); //登录成功提示消息
view.dismissLoading(); //关闭加载窗
activity.startActivity(new Intent(activity, MainActivity.class)); //跳转到主界面
}
}, 2000);
} else {
new Handler().postDelayed(new Runnable() { //延迟1秒后执行
@Override
public void run() {
view.toastFailMsg(); //登录失败提示消息
view.dismissLoading(); //关闭加载窗
}
}, 1000);
}
}
}
总结
以上代码简单地实现了一个用户登陆的mvp模式,这种模式能够将我们的代码充分解耦,能够很好地对代码进行维护和扩展。但是有些时候我们的需求是一些比较简单的业务逻辑和界面,这时候也可以结合mvc的方式来加快我们的开发速度,因为如果每个界面都要创建Presenter、View等会让代码比较臃肿。
网友评论