相信大家在网上看过关于MVP架构的博客数不胜数,至于MVP到底是什么,也不需要我再从百度百科复制一遍了,通俗的说MVP就是解决Model和View的耦合,没有使用架构的代码就是一个Activity里处理了UI逻辑、网络请求等等,有的时候一个Activity五六百行,我曾经看过同事的一个适配器上千行,因为业务逻辑过于复杂,说了这么多,MVP到底有什么作用呢?我们非用不可吗,MVP可以把"功能"抽离出来,因为一个项目中会出现很多页面的某个功能是相似的,这就代表我们不用架构的话,重复的代码会大量的出现在我们的项目中,这不符合单一原则,最后引用一下大佬的总结,“mvp最关键的点就是把Activity中的ui逻辑抽象成view接口,把业务逻辑抽象成presenter接口,model还是数据模型。架构是对客观不足的妥协,规范是对主观不足的妥协。”

public interface IBaseView {void showNetError();void showDataError();void hideLoading();void showLoading();void showMsg(String msg);Activity getMyContext();
}

基类View

public interface IBasePresenter<T> {void attachView(T baseView);void detachView();boolean isViewAttached();
}

基类Presenter

/*** Presenter 基类* @param <T>*/
public abstract class BasePresenter<T extends IBaseView> implements IBasePresenter<T> {private T view;@Overridepublic void attachView(T baseView) {this.view = baseView;initView();initModel();}abstract void initView();abstract void initModel();@Overridepublic void detachView() {view = null;}@Overridepublic boolean isViewAttached() {return view != null;}public T getView() {return view;}
}

抽象基类Presenter

/*** Model 回调动作* @param <T>*/
public interface OnCallBackModel<T> {/*** 请求数据成功时回调动作* @param datas*/void onSuccess(T datas);/*** 数据请求成功,由后台返回的code码非成功码调用动作* @param msg*/void onFailure(String msg);/*** 网络异常*/void onNetError();/*** 数据异常*/void onDataError();/*** 网络请求数据完毕后的执行动作,比如隐藏加载动画*/void onComplete();/*** 网络请求数据之前,比如开启加载动画*/void onBefore();
}

Model的回调接口
以上我自己结合网上博客上的那些MVP博客总结修改的,也是自己在项目中用的,架构比较简单、简陋,但是对于小项目也够用了,也没打算用MVP的开源框架,全自己手写,这里解释下为什么有抽象基类Presenter,因为所有的Presenter都要判断View是否贴上、添加、移除View,这样提取共性比较合适。
在实际的开发过程中,我们可能遇到这种情况,就是一个Activity中需要请求网络判断是否需要更新当前版本和更新用户信息数据,然后另一个Activity也包含了更新用户数据的功能,这样我们就有必要为这个单一的功能抽象出来,那我们怎么在Presenter中去调度呢?

public class AppUpdatePresenter extends BasePresenter<IAppUpdateView> implements IAppUpdatePresenter, IUpdateUserInfoPresenter {private IAppUpdateModel model;private IUpdateUserInfoModel userInfoModel;private IAppUpdateView view;@Overridepublic void appUpdate(final String version, String type) {model.getAppUpdate(version, type, new OnCallBackModel<AppVersionBean>() {@Overridepublic void onSuccess(AppVersionBean datas) {if(isViewAttached()){view.setAppUpdate(datas);}}@Overridepublic void onFailure(String msg) {if(isViewAttached()){view.showMsg(msg);}}@Overridepublic void onNetError() {}@Overridepublic void onDataError() {}@Overridepublic void onComplete() {}@Overridepublic void onBefore() {}});}@Overridepublic void updateUserInfo(String phone) {userInfoModel.getUserInfo(phone);}@Overridevoid initView() {view = getView();}@Overridevoid initModel() {model = new AppUpdateModel();userInfoModel = new UpdateUserInfoModel();}
}

最后再贴上Model代码

public class AppUpdateModel implements IAppUpdateModel {@Overridepublic void getAppUpdate(String version, String type, final OnCallBackModel callBackModel) {Map<String, String> params = new HashMap<>(2);LogUtils.e("当前版本号------>",  version);params.put("version", version);params.put("type", type);HttpManager.postHttp(ConstantUtils.APP_VERSION, params, new StringCallback() {@Overridepublic void onError(Call call, Exception e, int id) {}@Overridepublic void onResponse(String response, int id) {if(StringUtils.isJSONType(response)){AppVersionBean bean = JsonUtils.fromJson(response, AppVersionBean.class);if(null == bean){callBackModel.onFailure(ConstantUtils.DON_NEED_UPDATE);return;}if(bean.getCode().equals(ConstantUtils.DATA_SUCCESS)){callBackModel.onSuccess(bean);}else {callBackModel.onFailure(ConstantUtils.DON_NEED_UPDATE);}}}});}}
public class UpdateUserInfoModel implements  IUpdateUserInfoModel{@Overridepublic void getUserInfo(String phone) {Map<String, String> params = new HashMap<>(1);params.put("mobile", phone);HttpManager.postHttp(ConstantUtils.CARD_INFO, params, new StringCallback() {@Overridepublic void onError(Call call, Exception e, int id) {}@Overridepublic void onResponse(String response, int id) {if (StringUtils.isJSONType(response)) {CardInfoBean bean = JsonUtils.fromJson(response, CardInfoBean.class);if (null == bean) {return;}if (null != bean.getData() && bean.getCode().equals(ConstantUtils.DATA_SUCCESS)) {User user = AppUtils.getUserData();CardInfoBean.DataBean datas = bean.getData();user.setReal_name(datas.getReal_name());user.setGender(datas.getGender());user.setPassport_num(datas.getPassport_num());user.setPassport_status(datas.getPassport_status());user.setExpire_time(datas.getExpire_time());user.setId_num(datas.getId_number());AppUtils.updateUserData(user);}}}});}
}

最开始我的想法是在更新版本的接口上继承更新用户信息的接口,但是后面想想其实可以实现,但是有一个大问题,违背了单一原则,每一个接口仅仅只负责一个功能,如果需要多个功能,那就新建一个接口多继承所需的功能,切记不可让接口继承接口,接口多继承接口,类多实现接口。


http://www.taodudu.cc/news/show-3672933.html

相关文章:

  • 使用Flutter编写一个简单的天气查询App
  • 大数据Flink End-to-End Exactly-Once
  • java爬虫编写步骤_JAVA爬虫--编写第一个网络爬虫程序
  • Android 架构之 MVC 架构模式
  • Flink(53):Flink高级特性之端到端精确一次消费(End-to-End Exactly-Once)
  • 夜光带你走进 Java Web应用程序开发(二十八)
  • 教你用一个Json做一个App,移动应用开发框架
  • 第十一章 Servlet MVC模式
  • 关于我在字节跳动青训营做了个抖音这件事
  • Android MVP模式 解析JSON 显示到ListView上
  • Hadoop详解(三)——MapReduce原理和执行过程,远程Debug,Writable序列化接口,MapReduce程序编写
  • MVC模式计算一元二次方程的根及梯形面积
  • 基于J2EE轻量级容器构件框架六、数据bean(DataBean)
  • MVC模式使用JDBC查询数据库中表的记录
  • android 的MVP模式的介绍
  • Android中的RxJava
  • Android架构设计之MVC/MVP/MVVM浅析
  • 【高编 6】 北邮 高级网络程序设计 6. JSPJavaBean
  • 基于JAVA与JSP下的网上商城设计
  • Hadoop---(2)MapReduce(分布式计算编程模型)
  • 《JSP程序设计》手机销售网后台设计方案1
  • RXJava源码详解
  • Android设计模式之MVP
  • Android 你应该学会的设计模式MVP
  • php socket fread,linux下使用fread读socket套接字的注意点
  • fread函数详解
  • PHP fread,PHP fread文件指针位置
  • c语言中fread读取结构体,fread读取结构体注意事项
  • MATLAB fread读整数,MATLAB fread函数分析 | 学步园
  • matlab fread精度,matlab中fread函数的应用

菜鸡的MVP架构漫谈相关推荐

  1. 《架构漫谈》阅读感想

    谈及架构,源于建筑. 一想到建筑,就能想到一块空间,有墙,有门,有窗. 用墙围住的一块密闭的盒子空间,通过门窗与外界保持沟通. 空间内根据住户的生活需求不同,划分为各个房间,有不同的功用. 然后人们对 ...

  2. JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入)

    JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入) 开发流程:需求文档 接口文档 效果图 开发环境统一:JDK1.8 IDEA win10 GIT SSM SSH SpringB ...

  3. 一个一年工作经验的菜鸡程序员的一年总结

    坎坷并且顺利的一年 前言 一.为什么会干这一行? 二.入职 1.被大佬照顾的小白 2.被浪潮拍死的弄潮儿 3.重新出世的大菜鸡 回顾以前展望未来 前言 刚开始准备投入这个行业是2020年8月的时候,当 ...

  4. 双非菜鸡的春招之路!顺丰,vivo,携程,字节跳动,希望我的面经对你们有帮助!

    前言 本人双非本科,物理专业,无实习经历,菜鸡一枚. 差不多3月初开始投递简历,总共30余家公司,简历没过的有十家左右,3月中旬陆陆续续参加笔试,面试.一些笔试因为时间冲突或者后续流程等太久,就没有参 ...

  5. 【菜鸡读论文】Face2Exp: Combating Data Biases for Facial Expression Recognition

    [菜鸡读论文]Face2Exp: Combating Data Biases for Facial Expression Recognition 最近上海开始降温了,而且常常下雨,天气开始变得好冷啊! ...

  6. 【菜鸡读论文】Dive into Ambiguity: Latent Distribution Mining and Pairwise Uncertainty Estimation for Facia

    Dive into Ambiguity: Latent Distribution Mining and Pairwise Uncertainty Estimation for Facial Expre ...

  7. 【菜鸡读论文】AU-assisted Graph Attention Convolutional Network for Micro-Expression Recognition

    [菜鸡读论文]AU-assisted Graph Attention Convolutional Network for Micro-Expression Recognition 芜湖!又到了每周分享 ...

  8. [Android] Android MVP 架构下 最简单的 代码实现

    Android  MVP 架构下  最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...

  9. 【译】使用Kotlin和RxJava测试MVP架构的完整示例 - 第1部分

    原文链接:android.jlelse.eu/complete-ex- 最近我创建了一个playground项目来了解更多关于Kotlin和RxJava的信息. 这是一个非常简单的项目,但有一部分,我 ...

最新文章

  1. ModuleNotFoundError: No module named ‘pandas._libs.tslibs.base‘
  2. pip install skimage安装skimage库出错的解决办法
  3. aspnet中操作excel报com错误的解决方法
  4. netapp 2个控制器spare盘分配
  5. Visial Studio 2019提示:namespace std 没有成员 max 的解决方法
  6. 浏览器 UC 自动添加关键字 去掉关键字
  7. 从Oracle到PostgreSQL:最全控制文件
  8. 一梦江湖一直获取服务器信息啥意思,《一梦江湖》原《楚留香》手游:叮咚!少侠你的NPC侠缘送来信物...
  9. Glut 回调函数小结
  10. 学习数学到底有什么用?
  11. Android Binder机制
  12. java学习之htlm总结
  13. 在 Windows 10 上安装 Coq 库 Mathematical Components
  14. android 获取粗略位置_从Android上的GPS提供商处获取*粗略*位置
  15. java中封装类Feild和使用setter和getter方法访问封装的类Feild
  16. redis:Unable to connect to localhost:6379
  17. mysql数据库语言_mysql数据库sql语句基础知识
  18. SysML图例-核聚变
  19. 项立刚:大陆为什么没有台积电
  20. 从 Go log 库到 Zap,怎么打造出好用又实用的 Logger

热门文章

  1. 还不会发包?30S教会你
  2. 网络带宽测试工具-iperf
  3. Android Studio —— ArrayAdapter
  4. JAVA Instrumentation
  5. java 计算三角形面积
  6. build.prop参数详解和部分修改
  7. shellexecute 执行完成_「shellexecute」C++之ShellExecute使用详解 - seo实验室
  8. mikrotik CAPsMAN设置教程
  9. 【Android】相对布局(RelativeLayout)最全解析
  10. relativelayout中心对齐_Android中关于相对布局RelativeLayout的技巧汇总