**本文仅为个人在学习mvp模式中的一点个人见解
M:
model,实体层,此处不是传统的实体,我们需要把实体视图化,可以理解为Viewmodel,例如一个登陆视图,含有用户名、密码,我们需要把model视图化,并绑定到视图上(我理解为该model的行为,如登陆、修改密码)
V:
view,视图层对应xml,Activity,Fragment
P:
Presenter,逻辑控制层,同时持有model与view对象
*采用MVP模式的优势是:
把业务逻辑抽离到Presenter层中,View层专注于UI的处理。
分离视图逻辑与业务逻辑,达到解耦的目的。
提高代码的阅读性。
Presenter被抽象成接口,可以根据Presenter的实现方式进行单元测试。
可拓展性强。
*采用MVP模式的缺点:
项目结构会对后期的开发和维护有一定的影响。具体视APP的体量而定。
代码量会增多,如何避免编写过多功能相似的重复代码是使用MVP开发的一个重点要处理的问题。
有一定的学习成本。
以用户登陆为例:
model层的具体代码
提供想要展示在view层的数据和业务逻辑实现
一、创建用户model
public class User {
public String account;
public String pwd;
}
二、把model视图化
创建user的行为接口
public interface UserApi {
interface LoginListener{
void onSuccess();
void onFail();
}
void login(User user, LoginListener listener);
}
三、实现行为接口
public class UserImpl implements UserApi{
@Override
public void login(final User user, final LoginListener listener) {
//模拟登陆
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (TextUtils.isEmpty(user.account)||TextUtils.isEmpty(user.pwd)){
return;
}
int i =new Random().nextInt(1);
if (i==0){
listener.onSuccess();
}else {
listener.onFail();
}
}
},2000L);
}
}
View层的具体代码
负责数据显示、题提供用户交互;设置监听后把工作叫个Presenter,因此持有Presenter, 调用Presenter中的相关方法即可。
public class UserViewApi {
public interface Login{
void starLogin();
void loginEnd();
void loginSuccess();
void loginFail();
}
}
public class LoginActivity extends Activity implements UserViewApi.Login {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new UserPresenter(this,new UserImpl()).loginToServer(new User());
}
@Override
public void starLogin() {
}
@Override
public void loginEnd() {
}
@Override
public void loginSuccess() {
}
@Override
public void loginFail() {
}
}
Presenter层具体代码
Presenter在view与model中间层,获得model数据后构建到view,可以决定view层的各种操作
public interface UserPresenterApi {
void loginToServer(User user);
}
public class UserPresenter implements UserPresenterApi, UserApi.LoginListener {
private UserViewApi.Login viewApi;
private UserImpl userImpl;
public UserPresenter(UserViewApi.Login viewApi, UserImpl user){
this.viewApi = viewApi;
this.userImpl = user;
}
@Override
public void loginToServer(User user) {
viewApi.starLogin();
userImpl.login(user,this);
}
@Override
public void onSuccess() {
viewApi.loginEnd();
viewApi.loginSuccess();
}
@Override
public void onFail() {
viewApi.loginEnd();
viewApi.loginFail();
}
}