MVP架构在android还是很好用的。我也在试着将mvp用在项目中。
下面我就来说说mvp模式的应用和优化。
mvp模式的概念
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
比较
mvc:
1,在MVC里,View是可以直接访问Model的,View里会包含Model信息,不可避免的还要包括一些业务逻辑。
2,Model不依赖于View,但是View是依赖于Model。
3,有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。
mvp:
1,在MVP里,Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。
2,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互。从而使得在变更View时候可以保持Presenter的不变,即重用
3,应用程序的逻辑主要在Presenter来实现,其中的View是很薄的一层。这样一来就编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试
mvp的系统设计
我们先来个mvp系统的设计。(我们在这里模仿一个登陆的请求)
概要设计图
1,mobel层
mobel接口:规定操作数据的接口。
接口:IUserLoginMobel
/**
* 用户操作接口 Model 业务层接口
*/
public interface IUserLoginMobel{
/**
* 用户登录
*
* @param name
* @param pwd
* @param loginListener
*/
void login(String name, String pwd, OnLoginListener loginListener);
}
登录状态回调接口:
/**
* 登陆状态接口
*/
public interface OnLoginListener {
void loginSuccess(UserInfoBean user);
void loginFailed(String message);
}
类:用户登陆操作类 UserLoginModel
/**
* 用户登陆操作类,Model 业务层(接收数据,处理出局)
*/
public class UserLoginModel implements IUserLoginMobel {
@Override
public void login(final String name, final String pwd, final OnLoginListener loginListener) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
if ("admin".equals(name) && "admin".equals(pwd)) {
UserInfoBean userInfoBean = new UserInfoBean();
userInfoBean.setUserId(System.currentTimeMillis());
userInfoBean.setUserName(name);
userInfoBean.setUserPwd(pwd);
loginListener.loginSuccess(userInfoBean);
} else {
loginListener.loginFailed("密码错误");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
2,Presenter层
定义 UserLoginPresenter类
/**
* 用户登录的任命者。Presenter (用于接收模型发出的结果,给view层发送命令)
*/
public class UserLoginPresenter {
protected IUserLoginView mvcView;//view的接口
private IUserLoginMobel userLoginMobel;//mobel的接口
private Handler mHandler = new Handler();
public UserLoginPresenter(IUserLoginView userLoginView) {
this.mvcView = userLoginView;
this.userLoginMobel = new UserLoginModel();//实例化用户登录业务层
}
public void login() {
mvcView.showLoading();
userLoginMobel.login(mvcView.getUserName(), mvcView.getPassword(), new OnLoginListener() {
@Override
public void loginSuccess(final UserInfoBean user) {
//需要在UI线程执行
mHandler.post(