MVC模式

M Model 数据模型 在应用中通常用来处理数据逻辑逻辑

V View 视图,可见通常用来处理数据显示

C Controller 控制器 用来处理业务逻辑

Android 封装BaseActivity 2024_Android

通过上图可知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。

Android 封装BaseActivity 2024_MVP使用_02

由图可以看出 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更多的是一种思想,而非模式,只要理解透彻,每个人都可以有不同的封装和改进。