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;
    }
}
posted @   hzyuan  阅读(1397)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示