Android 之 MVP 架构


MVP架构是为了让各个模块之间降低耦合,方便维护,也可以让代码更简洁,让代码简洁的意思是让代码更清晰,并不是让代码更少;MVP契约者是为了进一步的低耦合、接口统一管理。

M(Model层) ——> 业务数据

V(View层)——> 视图(activity,layout,自定义布局)

P(Presenter层)——> Model 和 View 之间的交互

MVP架构优点

  • 降低耦合度,View层和Model层完全分离
  • 所有View层和Model层的交互都交给Presenter层
  • 后续扩展性和可维护性强

MVP架构缺点

  • 复杂的业务会导致presenter层过大
  • 通过UI事件的触发对数据进行处理,activity 需要编写大量的事件。通过事件调用 presenter 的业务处理方法,UI改变后牵扯的逻辑耦合度太高。
  • 如果 Presenter 过多地渲染了视图,往往会使得它与特定的视图的联系过于紧密,一旦视图需要变更,那么 Presenter 也需要变更了。

分包

  • base 包:基类
  • common包:存放一些常量,接口,公用的东西
  • contract包:契约者
  • model包:M层
  • presenter包:P层
  • ui包:V层
  • utils包:工具类
  • widget包:存放自定义的组件

Base 基类

放到 base 包里

BaseActivity

/**
 * V层Activity的一个基类
 * @param <P>
 * @param <CONTRACT>
 */
public abstract class BaseActivity<P extends BasePresenter, CONTRACT> extends AppCompatActivity implements Contract<CONTRACT>, View.OnClickListener {

    //P层引用
    public P mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(getContentViewId());

        initView();
        initData();
        initListener();

        mPresenter = getPresenterInstance();   //绑定P层
        mPresenter.bindView(this);
    }

    /**
     * 获取布局id
     * @return 返回布局id
     */
    public abstract int getContentViewId();

    /**
     * 绑定组件
     */
    public abstract void initView();

    /**
     * 设置监听器
     */
    public abstract void initListener();

    /**
     * 绑定数据
     */
    public abstract void initData();


    /**
     * 获取P层实例
     */
    public abstract P getPresenterInstance();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        destroy();
    }

    /**
     * activity 销毁时执行的操作
     */
    public abstract void destroy();
}

BaseModel

/**
 * Model层的一个基类
 * @param <P>
 * @param <CONTRACT>
 */
public abstract class BaseModel<P extends BasePresenter, CONTRACT> implements Contract<CONTRACT> {

    /**
     * 关联P层
     */
    public P mPresenter;

    /**
     * 绑定Presenter
     * @param mPresenter
     */
    public BaseModel(P mPresenter) {
        this.mPresenter = mPresenter;
    }
}

BasePresenter

/**
 * P层的一个基类
 * @param <V>
 * @param <M>
 * @param <CONTRACT>
 */
public abstract class BasePresenter<V extends BaseActivity, M extends BaseModel, CONTRACT> implements Contract<CONTRACT> {

    //V层引用
    public V mView;
    //M层引用
    public M mModel;

    /**
     * 绑定M层
     */
    public BasePresenter() {
        this.mModel = getModelInstance();
    }

    /**
     * 绑定V层
     * @param mView
     */
    public void bindView(V mView) {
        this.mView = mView;
    }

    /**
     * 解绑V层
     */
    public void unBindView() {
        this.mView = null;
    }

    /**
     * 获取 M 层实例
     * @return
     */
    public abstract M getModelInstance();
}

Contract

/**
 * 获取契约者的接口
 * @param <CONTRACT>
 */
public interface Contract<CONTRACT> {

    /**
     * 获取契约者
     * @return
     */
    CONTRACT getContract();
}

契约

MVP的契约者(Contract)主要统一了接口管理,让代码看起来更清晰。

举例

/**
 * 登录契约接口
 */
public interface ILogin {

    /**
     * V层和P层接口
     */
    interface VP {
        void requestLoginContract(String name, String pwd);
        void responseLoginContract(boolean result);
    }

    /**
     * M层接口
     */
    interface M {
        void requestLoginContract(String name, String pwd) throws SQLException;
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM