首先,啥是MVP架构?
MVP架构是一种组织代码的形式结构,全称是Model View Presenter,其中每一个单词代表架构中的一部分,即分别为Model:处理数据相关的,View:界面显示的,Presenter:连接View和Model的中介
MVP架构有啥优势和特点
- 首先,MVP能够有效地降低View的复杂性。一般我们把Activity和Fragment看作是View,用来处理界面UI的显示和更新。而MVP则是把Activity和Fragment中的跟业务逻辑相关的代码抽离出来,从而解耦View元素和业务逻辑
- MVP模式可以让UI界面和数据分离,我们的应用至少可以分为3层,这样使得我们也可以对这3个层次进行独立的单元测试
- MVP并不是一个标准化的模式,可以根据自己的需求修正MVP的实现方式。只要保证我们是通过Presenter将View和Model解耦合、降低类型复杂度、各个模块可以独立测试、独立变化,这就是正确的方向
如何在项目中应用MVP模式
下面我们直接通过代码来演示如何用MVP架构来组织代码
- 首先抽离出具体的业务逻辑接口,这里简单起见,就定义了一个获取数据的接口
public interface MvpContact {
interface Presenter {
/**
* 获取数据
*/
void getData();
}
interface View {
/**
* 更新数据到View
*/
void showData();
/**
* 弹出错误提示
*/
void showError();
}
}
- 上述的MvpContact类里面包含了2部分接口,Presenter接口里面是具体的数据请求,View层通过调用这个接口发起数据请求;View接口则是用于更新UI界面的接口
public class MvpModel {
public void getData(GetDataListener listener) {
//执行具体的请求
//请求失败
listener.onError();
//请求成功
listener.onSuccess();
}
}
- 上面的MvpModel类对应MVP中的Model层,专门负责处理数据,比如网络请求或是从本地获取数据。参数里的接口用于将数据请求的结果回调。
public interface GetDataListener {
/**
* 请求失败
*/
void onError();
/**
* 请求成功
*/
void onSuccess();
}
- 下面我们来看看Presenter层的MvpPresenter类
public class MvpPresenter implements MvpContact.Presenter{
MvpContact.View view;
MvpModel model;
public MvpPresenter(MvpContact.View mView) {
view = mView;
model = new MvpModel();
}
@Override
public void getData() {
model.getData(new GetDataListener() {
@Override
public void onError() {
//请求失败弹出提示等
view.showError();
}
@Override
public void onSuccess() {
//请求成功更新数据到UI
view.showData();
}
});
}
}
- 首先MvpPresenter在初始化的时候会与View绑定,并初始化用于处理数据的MvpModel,以便进行数据处理
- MvpPresenter里面实现了MvpContact中的Presenter接口,接口里面调用MvpModel的getData方法来进行数据请求,这样就将View层发起的数据请求转发给了Model层来处理,并通过GetDataListener接口回调数据处理的结果
- 数据处理回调以后,通过更新UI的接口来把结果更新到UI上。下面我们来看看MVP中的View层,这里我们以一个Activity代表
public class MvpActivity extends Activity implements MvpContact.View{
MvpPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mvp);
presenter = new MvpPresenter(this);
//请求数据
presenter.getData();
}
@Override
public void showData() {
}
@Override
public void showError() {
}
}
- 首先,MvpActivity在onCreate方法中初始化Presenter,并通过调用Presenter的getData接口发起数据请求
- MvpActivity通过实现MvpContact的中View接口来获取数据请求的结果回调,并进行相应的反应,比如更新UI或是弹出错误提示
以上就是MVP的简单应用啦!是不是很简单?
MVP架构的应用是很灵活的,可以根据需要进行修改。比如上面我们实现的MVP模式中,Model层通过设置Listener将处理结果回调给Presenter层,这就会有一个问题:当Model层中的数据处理方法比较多的时候,我们就需要写很多的回调接口了,因为可能每个数据请求成功返回的结果都是不同的实体!
我们可以将上面的实现修改一下,直接在Presenter里面进行数据的处理,把Model给撇掉,对应修改后的MvpPresenter类如下
public class MvpPresenter implements MvpContact.Presenter{
MvpContact.View view;
public MvpPresenter(MvpContact.View mView) {
view = mView;
}
@Override
public void getData() {
//执行具体的请求
//请求失败弹出提示等
view.showError();
//请求成功更新数据到UI
view.showData();
}
}
好了,以上就是MVP在Android中的简单应用了。
当然架构有很多种,除了这里介绍的MVP,还有MVVM、MVC等。我们的目标是让我们的项目结构更加合理,扩展性更强,能够拥抱变化。每种架构都有其特点和优势,可以根据实际需要来选择。
最后有兴趣的小伙伴可以学习一下Google官方的示例
欢迎关注我的微信公众号,期待与你一起学习,一起交流,一起成长!
AntDream
网友评论