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;
}
}
本文来自博客园,作者:hzyuan,转载请注明原文链接:https://www.cnblogs.com/hzyuan/p/13420241.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)