MVP简介
MVP(Model-View-Presenter) 是针对有GUI存在的应用程序,比如像安卓,苹果以及PC的客户端软件中用以划分组织代码的一种设计模式,是由MVC模式升级演进出来的,目的在于,对于GUI层来说,把UI展示与逻辑分开。
MVP(Model-View-Presenter)模式
Model:主要负责数据的存取功能。Presenter需要通过Model层来存储、获取数据。
View:负责处理用户事件和视图部分的展示。在Android中,它可能是Activity、fragment类或者是某个View控件。
Presenter:作为View和Model之间沟通的桥梁,它从Model层检索数据后返回给View层,使得View和Model之间没有耦合。
在MVP里,Presenter完全将Model和View进行了分离,主要的程序逻辑在Presenter里实现。而且,Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时可以保持Presenter的不变,这点符合面向接口编程的特点。View不应该有简单的Set/Get方法,以及用户输入和设置界面显示的内容。除此之外就不应该有更多的内容。绝不允许View直接访问Model,这就是MVP与MVC的很大不同之处。
MVP与MVC的对比
MVP项目演示
案例展示
一个登陆的小demo来展示MVP的使用
model层描述和具体代码
提供我们想要展示在view层的数据和具体登陆业务逻辑处理的实现,具体代码实现如下:
/**
* 登录接口
*/
public interface IUser {
void login(String username,String password,LoginListener listener);
interface LoginListener{
void success(User user);
void failed();
}
}
/**
* 登录接口的实现类
*/
public class UserBiz implements IUser {
@Override
public void login(final String username, final String password, final LoginListener listener) {
//开启子线程模拟登录
new Thread(){
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
if ("admin".equals(username)&&"123456".equals(password)){
User user=new User();
user.setUsername(username);
user.setPassword(password);
listener.success(user);
}else{
listener.failed();
}
}
}.start();
}
}
view层描述和具体代码
定义了与界面交互的方法,MVP下Activity和Fragment以及View的子类体现在了这一 层,Activity一般也就做加载UI视图、设置监听再交由Presenter处理的一些工作,所以也就需要持有相应Presenter的引用。本层所需要做的操作就是在每一次有相应交互的时候,调用presenter的相关方法就行。具体实现代码如下:
/**
* 登陆View的接口,实现类也就是登陆的activity
*/
public interface LoginView {
//获取用户名和密码
String getUsername();
String getPassword();
//登录成功与失败
void toMainActivity(User user);
void showFailedError();
//给用户的提示
void showLoading();
void hideLoading();
}
presenter层描述和具体代码
presenter是一个中间人的角色,通过model层来获得和保存数据,然后通过view更新界面,这期间通过定义接口使得view和model没有任何交互。具体实现代码如下:
/**
*主要是Model层和View层的交互和操作
*/
public class LoginPresenter {
private LoginView loginView;
private UserBiz userBiz;
private Handler mHandler=new Handler() ;
public LoginPresenter(LoginView loginView) {
this.loginView = loginView;
userBiz=new UserBiz();
}
public void login() {
loginView.showLoading();
userBiz.login(loginView.getUsername(), loginView.getPassword(), new IUser.LoginListener() {
@Override
public void success(final User user) {
mHandler.post(new Runnable() {
@Override
public void run() {
loginView.toMainActivity(user);
loginView.hideLoading();
}
});
}
@Override
public void failed() {
mHandler.post(new Runnable() {
@Override
public void run() {
loginView.showFailedError();
loginView.hideLoading();
}
});
}
});
}
}
补充
参考资料
这是一个mvp的参考资料https://github.com/antoniolg/androidmvp,大家可以下载下来学习一下。
项目地址
优快云:https://download.youkuaiyun.com/download/wen_haha/10720667