MVC模式
M Model 数据模型 在应用中通常用来处理数据逻辑逻辑
V View 视图,可见通常用来处理数据显示
C Controller 控制器 用来处理业务逻辑
通过上图可知Controller、Model、View 之间都可以直接直接交互,当View需要更新时,首先去找 Controller,然后 Controller 找 Model 获取数据,Model 获取到数据之后直接更新 View。
在Android开发中如果使用MVC模式我们知道几乎会把所有的逻辑都写在Activity中,这样一来Activity即充当了View层又充当了Controller层,这样就会使View和Controllermei没有真正的分离。而且会造成Activity中的代码量非常大,逻辑混乱,造成后期的开发和维护成本大大提高。
MVP模式
M Model 数据模型 负责数据的请求解析等工作
V View 视图,可见通常用来处理数据显示
P Presenter 是View和Model交互的桥梁
为了使Model和View彻底分离,改善MVC存在的问题提出了MVP。
由图可以看出 View和Model之间不存在任何的交互,Presenter充当Model和View之间的桥梁,Model想要和View之间交互必须通过Presenter,在View需要更新时必须先找Presenter,Presenter去找Model更新数据,当Model获取到数据后再通知Presenter,presenter再通知View更新数据。这样以来View只负责处理数据显示,Model只负责数据的请求解析等工作。把所有的业务逻辑全部放在Presenter中处理。这样就可以把Model和View完全解耦。
再Android开发中使用MVP模式,会使Activity的工作的简单了,只用来响应生命周期,其他工作都丢到Presenter中去完成。会让项目结构变得更加简单,有利于后期开发和维护。
MVP的简单封装
首先封装一个BaseView(接口) 将每个子类中都会用到的方法放在BaseView中,例如加载失败展示失败信息
public interface BaseView {
void showErroe(String errorMessage);
}
封装一个BasePresenter抽象类 为防止内存泄漏 再activity销毁时,将view置null。
public abstract class BasePresenter<T extends BaseView> {
private T view;
public T getView() {
return view;
}
public void attachView(T view) {
this.view = view;
}
public void detachView() {
view = null;
}
/**
* 页面初始化完成调用,此时页面控件已初始化完成
*/
public abstract void onStart();
}
MVP使用简单示例
1、定义一个契约类 contract,将View、Presenter都放入里面,将类的实现方法和接口都放在这里,方便查找与调试及后期维护
一个契约类对应一个activity
public class MainContarct {
private static boolean isSucceed = true;
interface View extends BaseView{
void upData(String data);
}
static class Presenter extends BasePresenter<View>{
@Override
public void onStart() {
requestDat();
}
private void requestDat(){
//执行Model 获取数据
if (isSucceed){
getView().upData("传送数据");
}else {
getView().showErroe("获取数据失败");
}
}
}
}
在Activity中实现View接口并更新UI操作
public class MainActivity extends AppCompatActivity implements MainContarct.View{
private TextView tv;
private MainContarct.Presenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
presenter = new MainContarct.Presenter();
if (presenter != null){
presenter.attachView(this);
}
presenter.onStart();
}
@Override
public void showErroe(String errorMessage) {
Toast.makeText(this, "获取数据错误", Toast.LENGTH_SHORT).show();
}
@Override
public void upData(String data) {
tv.setText(data);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (presenter != null) {
presenter.detachView();
}
presenter = null;
}
}
好了,这样就是简单的封装并使用MVP了,当然了MVP更多的是一种思想,而非模式,只要理解透彻,每个人都可以有不同的封装和改进。