移动开发架构设计实战


移动开发架构设计实战

文章插图
移动开发架构设计实战【移动开发架构设计实战】《移动开发架构设计实战》是2019年11月电子工业出版社出版的图书,作者是李云鹏 。
基本介绍书名:移动开发架构设计实战
作者:李云鹏
ISBN:9787121375071
页数:304
定价:¥89.0
出版社:电子工业出版社
出版时间:2019年11月
开本:16开
内容简介本书覆盖了移动开发中涉及的多种架构模式,基于Android平台对架构模式进行实战,可以帮助入门开发者了解架构模式,进阶开发者掌握架构模式,技术领导者进行架构选型 。本书内容包括:流行架构模型MVX系列——MVC架构、MVP架构、MVVM架构,依赖注入框架Dagger2,函式回响式框架RxJava2,Google推荐的生命周期感知架构组件AAC,整洁的架构“The Clean Architecture”和组件化架构的运用方法与实战 。本书语言精练,内容清晰,代码易于理解,适合计算机相关行业的从业者阅读与学习 。目录第1章 什幺是架构11.1 架构设计理念11.1.1 软体架构的起源11.1.2 架构设计三要素21.1.3 什幺是优秀的软体架构设计21.1.4 软体架构设计的关注点31.2 软体架构设计的本质和目的31.2.1 做出决策31.2.2 降低软体熵41.3 架构设计思维41.3.1 简化思维41.3.2 分层思维51.3.3 分治思维61.3.4 叠代思维61.4 架构设计模式原则71.4.1 单一职责原则71.4.2 开放封闭原则81.4.3 里氏替换原则91.4.4 依赖倒置原则91.4.5 接口分离原则101.5 架构设计步骤111.5.1 认识系统111.5.2 设计系统121.5.3 创建系统141.5.4 收集反馈141.6 小结15第2章 MVC架构:表现层分离162.1 什幺是MVC162.1.1 MVC的诞生162.1.2 MVC的分层与职责172.1.3 MVC在移动开发中的争议182.2 MVC的模式192.2.1 被动模式192.2.2 主动模式192.2.3 观察者模式202.2.4 被动模式与主动模式的区别212.3 MVC的核心思想212.4 小结22第3章 实战:基于MVC架构设计的日记App233.1 层级职责划分233.2 準备阶段243.2.1 準备、创建View243.2.2 清单档案Manifest配置263.2.3 初始化Fragment273.3 创建View283.4 数据处理313.4.1 创建Model313.4.2 创建本地数据源323.4.3 数据持久化工具333.4.4 实现本地数据源343.4.5 填充测试数据363.4.6 使用数据仓库管理数据373.5 创建Controller403.5.1 Controller初始化403.5.2 创建Adapter413.5.3 创建ViewHolder433.5.4 Controller的协调工作443.6 运行App483.7 实现主动模式的MVC493.7.1 改造Model493.7.2 注册观察者503.8 小结50第4章 MVP架构:开始解耦524.1 什幺是MVP524.1.1 MVP架构的起源524.1.2 MVP的分层与职责524.2 MVP的核心思想534.2.1 面向接口编程534.2.2 德墨忒尔定律544.3 MVP与MVC的区别554.4 MVP模式存在的问题564.4.1 责任过重的Presenter564.4.2 业务逻辑无法复用564.4.3 急剧扩增的接口数量574.5 如何解决Presenter的复用问题574.5.1 提供工具类574.5.2 提供多对一的Presenter574.5.3 分离出Interactor层584.6 小结59第5章 实战:MVP架构设计605.1 层级职责划分605.2 準备工作605.2.1 定义基础View接口605.2.2 定义基础Presenter接口615.3 重构:从MVC到MVP615.3.1 创建Presenter615.3.2 改造View625.3.3 传入Presenter实例635.3.4 开发过程中Presenter和View的直接依赖635.3.5 Presenter生命周期的处理645.3.6 列表Adapter的处理645.3.7 展示数据的处理655.3.8 对话框展示的处理675.3.9 选单的处理685.3.10 实现面向接口设计69 5.3.11 建立契约类695.4 实现MVP模式:日记修改功能705.4.1 创建日记修改Activity715.4.2 创建日记修改Fragment725.4.3 添加“完成”按钮745.4.4 创建日记修改Presenter755.4.5 日记操作处理765.4.6 页面跳转处理775.4.7 删除旧有的修改日记UI785.4.8 修改为面向接口设计795.5 小结79第6章 MVVM架构:双向绑定816.1 什幺是MVVM816.1.1 MVVM架构的起源816.1.2 MVVM的分层与职责826.2 MVVM的核心思想826.2.1 进一步解耦826.2.2 数据驱动836.2.3 双向绑定836.3 架构模式对比846.3.1 MVC与MVVM846.3.2 MVP与MVVM856.4 MVVM存在的问题866.4.1 ViewModel难以复用866.4.2 学习成本高866.4.3 调试困难866.5 小结87第7章 实战:MVVM架构设计887.1 什幺是DataBinding887.2 重构:从MVP到MVVM887.2.1 配置DataBinding支持897.2.2 修改Presenter为ViewModel897.2.3 消除契约类907.2.4 转换布局档案927.2.5 在布局中加入变数和表达式937.2.6 ViewModel继承BaseObservable947.2.7 在XML布局档案中定义列表数据属性957.2.8 使用BindingAdapter处理自定义属性977.2.9 绘製View布局987.2.10 为View属性赋值997.2.11 找到XML中的View1007.2.12 ObservableField原理1007.2.13 使用ObservableField1017.2.14 使用ObservableList1037.3 小结104第8章 依赖注入:Dagger2锋利的“匕首”1058.1 什幺是Dagger105 8.1.1 依赖注入1058.1.2 编译时注解解析1078.2 实现:将Dagger2加入MVP1088.2.1 配置Dagger21088.2.2 确定数据仓库改造目标1088.2.3 改造数据仓库1098.2.4 Inject注解1108.2.5 Component注解1118.2.6 Module注解1148.2.7 Provides注解1158.2.8 Scope注解1178.2.9 Singleton注解1178.2.10 Scope注解和Singleton注解的实现原理1188.2.11 日记列表模组依赖关係分析1208.2.12 创建日记列表模组Component1208.2.13 创建日记列表Presenter Module1218.2.14 Component的dependencies属性1238.3 存在的问题1258.3.1 学习成本极高1258.3.2 短期内开发效率低1258.3.3 灵活性不良好1268.4 小结126第9章 函式回响式框架:优雅的RxJava21279.1 什幺是RxJava1279.2 RxJava2的核心思想1289.2.1 函式回响式编程1289.2.2 背压1299.2.3 链式调用1299.3 实战:将RxJava2加入MVP1309.3.1 配置RxJava21309.3.2 Flowable1319.3.3 回响式拉取1329.3.4 修改数据源接口1339.3.5 修改本地数据源1339.3.6 Just操作符1349.3.7 Empty操作符1359.3.8 FromIterable操作符1359.3.9 To操作符1369.3.10 Subscriber和事件流1379.3.11 修改数据仓库1379.3.12 FlatMap操作符1399.3.13 Map操作符1409.3.14 修改Presenter141 9.3.15 CompositeDisposable和Disposable1429.3.16 Presenter生命周期1439.4 存在的问题1449.5 小结144第10章 AAC:搭建生命周期感知架构14510.1 什幺是AAC14510.2 AAC的核心思想14610.2.1 关注点分离14610.2.2 模型驱动界面14710.3 ViewModel+LiveData14810.3.1 DataBinding14810.3.2 Gradle依赖配置14910.3.3 AAC中的ViewModel14910.3.4 使用ViewModel15010.3.5 使用ViewModelProviders创建ViewModel15110.3.6 什幺是LiveData15210.3.7 MutableLiveData15310.3.8 创建LiveData15410.3.9 LiveData更新15510.3.10 LiveData接收变化15610.4 LifeCycle15610.4.1 生命周期15710.4.2 LifecycleObserver15810.4.3 LifecycleOwner15910.5 Room16010.5.1 Room的组成16010.5.2 实体16110.5.3 数据访问对象DAO16310.5.4 Room依赖配置16410.5.5 定义实体16410.5.6 创建Dao16510.5.7 创建资料库管理器16610.5.8 执行绪处理16810.5.9 修改本地数据源16910.5.10 资料库升级17210.6 小结173第11章 组件化架构:极速运行17411.1 什幺是组件化17411.2 组件化的核心思想17511.2.1 软体复用17511.2.2 信息隐藏17611.2.3 快速运行17711.3 组件分离17811.3.1 组件层级划分17811.3.2 组件划分17911.3.3 创建Module18011.3.4 组件依赖关係183 11.3.5 复用Gradle配置18711.3.6 公共资源组件18911.3.7 基础组件19111.3.8 移动依赖19411.3.9 Gradle版本号管理19411.3.10 处理Context19711.3.11 公共组件19811.3.12 日记列表展示组件20011.3.13 日记添加修改组件20211.3.14 Gradle Plugin冲突20411.3.15 运行主Module20411.4 使用路由20611.4.1 路由配置20611.4.2 使用Route跳转20711.4.3 携带参数跳转20811.5 组件运行21011.5.1 切换开关21011.5.2 组件配置21211.5.3 Manifest档案配置21211.5.4 集成运行21511.6 组件合併21611.6.1 组件命名冲突21611.6.2 Manifest档案合併策略21711.6.3 资源档案冲突21811.6.4 资源档案合併策略21911.7 小结220第12章 The Clean Architecture:整洁的架构22112.1 什幺是The Clean Architecture22112.2 The Clean Architecture的核心思想22212.2.1 单向依赖规则22212.2.2 业务规则分离22312.2.3 简单数据结构跨界22412.3 MVP-Clean架构22412.3.1 用例的请求数据和回响数据22412.3.2 用例的数据处理22612.3.3 用例的执行绪切换22812.3.4 创建用例22912.3.5 执行用例23012.3.6 封装请求数据23112.3.7 创建日记更新用例23412.3.8 重构日记修改Presenter23512.4 VIPER架构23812.4.1 什幺是VIPER架构23812.4.2 VIPER架构的层级划分23912.4.3 创建Interactor240 12.4.4 在协定中加入Interactor24112.4.5 使用Interactor24212.4.6 创建Router24212.4.7 在协定中加入Router24412.4.8 使用Router24412.5 Riblets架构24512.5.1 什幺是Riblets架构24512.5.2 Riblets架构的组件24612.6 小结247第13 Fragmentless:Fragment反对者24813.1 什幺是Fragmentless24813.2 Fragmentless实战24913.2.1 创建View24913.2.2 View附加状态判断25213.2.3 修改布局档案25313.2.4 修改Activity25413.3 小结255第14章 Conductor:短兵利刃25714.1 什幺是Conductor25714.2 Conductor实战25814.2.1 配置Conductor25914.2.2 Controller基类处理25914.2.3 重构Fragment26014.2.4 Controller的上下文26114.2.5 Controller活跃态26214.2.6 使用路由26214.2.7 日记修改页面处理26314.2.8 Controller构造方法26514.2.9 页面销毁26614.2.10 页面跳转26614.3 小结267第15章 外挂程式化:模组插拔26815.1 什幺是外挂程式化26815.2 外挂程式化实战26915.2.1 配置外挂程式化框架26915.2.2 配置主模组27015.2.3 验证环境配置27015.2.4 框架初始化27115.2.5 指定外挂程式类型27215.2.6 配置路由信息27215.2.7 创建载入页面27515.2.8 路由携带参数跳转27615.2.9 配置外挂程式的Launcher27615.2.10 编译277 15.3 小结278第16章 总结27916.1 架构演进27916.1.1 MVX系列架构27916.1.2 The Clean Architecture系列架构28016.1.3 模组化系列架构28116.2 选择合适的架构28216.2.1 认清你的团队规模28216.2.2 目前存在的问题28316.2.3 大型技术团队架构选型28316.2.4 中小型技术团队架构选型28416.2.5 独立开发者架构选型28516.3 复盘285,第1章 什幺是架构11.1 架构设计理念11.1.1 软体架构的起源11.1.2 架构设计三要素21.1.3 什幺是优秀的软体架构设计21.1.4 软体架构设计的关注点31.2 软体架构设计的本质和目的31.2.1 做出决策31.2.2 降低软体熵41.3 架构设计思维41.3.1 简化思维41.3.2 分层思维51.3.3 分治思维61.3.4 叠代思维61.4 架构设计模式原则71.4.1 单一职责原则71.4.2 开放封闭原则81.4.3 里氏替换原则91.4.4 依赖倒置原则91.4.5 接口分离原则101.5 架构设计步骤111.5.1 认识系统111.5.2 设计系统121.5.3 创建系统141.5.4 收集反馈141.6 小结15第2章 MVC架构:表现层分离162.1 什幺是MVC162.1.1 MVC的诞生162.1.2 MVC的分层与职责172.1.3 MVC在移动开发中的争议182.2 MVC的模式192.2.1 被动模式192.2.2 主动模式192.2.3 观察者模式202.2.4 被动模式与主动模式的区别212.3 MVC的核心思想212.4 小结22第3章 实战:基于MVC架构设计的日记App233.1 层级职责划分233.2 準备阶段243.2.1 準备、创建View243.2.2 清单档案Manifest配置263.2.3 初始化Fragment273.3 创建View283.4 数据处理31 3.4.1 创建Model313.4.2 创建本地数据源323.4.3 数据持久化工具333.4.4 实现本地数据源343.4.5 填充测试数据363.4.6 使用数据仓库管理数据373.5 创建Controller403.5.1 Controller初始化403.5.2 创建Adapter413.5.3 创建ViewHolder433.5.4 Controller的协调工作443.6 运行App483.7 实现主动模式的MVC493.7.1 改造Model493.7.2 注册观察者503.8 小结50第4章 MVP架构:开始解耦524.1 什幺是MVP524.1.1 MVP架构的起源524.1.2 MVP的分层与职责524.2 MVP的核心思想534.2.1 面向接口编程534.2.2 德墨忒尔定律544.3 MVP与MVC的区别554.4 MVP模式存在的问题564.4.1 责任过重的Presenter564.4.2 业务逻辑无法复用564.4.3 急剧扩增的接口数量574.5 如何解决Presenter的复用问题574.5.1 提供工具类574.5.2 提供多对一的Presenter574.5.3 分离出Interactor层584.6 小结59第5章 实战:MVP架构设计605.1 层级职责划分605.2 準备工作605.2.1 定义基础View接口605.2.2 定义基础Presenter接口615.3 重构:从MVC到MVP615.3.1 创建Presenter615.3.2 改造View625.3.3 传入Presenter实例635.3.4 开发过程中Presenter和View的直接依赖635.3.5 Presenter生命周期的处理645.3.6 列表Adapter的处理645.3.7 展示数据的处理655.3.8 对话框展示的处理67 5.3.9 选单的处理685.3.10 实现面向接口设计695.3.11 建立契约类695.4 实现MVP模式:日记修改功能705.4.1 创建日记修改Activity715.4.2 创建日记修改Fragment725.4.3 添加“完成”按钮745.4.4 创建日记修改Presenter755.4.5 日记操作处理765.4.6 页面跳转处理775.4.7 删除旧有的修改日记UI785.4.8 修改为面向接口设计795.5 小结79第6章 MVVM架构:双向绑定816.1 什幺是MVVM816.1.1 MVVM架构的起源816.1.2 MVVM的分层与职责826.2 MVVM的核心思想826.2.1 进一步解耦826.2.2 数据驱动836.2.3 双向绑定836.3 架构模式对比846.3.1 MVC与MVVM846.3.2 MVP与MVVM856.4 MVVM存在的问题866.4.1 ViewModel难以复用866.4.2 学习成本高866.4.3 调试困难866.5 小结87第7章 实战:MVVM架构设计887.1 什幺是DataBinding887.2 重构:从MVP到MVVM887.2.1 配置DataBinding支持897.2.2 修改Presenter为ViewModel897.2.3 消除契约类907.2.4 转换布局档案927.2.5 在布局中加入变数和表达式937.2.6 ViewModel继承BaseObservable947.2.7 在XML布局档案中定义列表数据属性957.2.8 使用BindingAdapter处理自定义属性977.2.9 绘製View布局987.2.10 为View属性赋值997.2.11 找到XML中的View1007.2.12 ObservableField原理1007.2.13 使用ObservableField1017.2.14 使用ObservableList1037.3 小结104第8章 依赖注入:Dagger2锋利的“匕首”105 8.1 什幺是Dagger1058.1.1 依赖注入1058.1.2 编译时注解解析1078.2 实现:将Dagger2加入MVP1088.2.1 配置Dagger21088.2.2 确定数据仓库改造目标1088.2.3 改造数据仓库1098.2.4 Inject注解1108.2.5 Component注解1118.2.6 Module注解1148.2.7 Provides注解1158.2.8 Scope注解1178.2.9 Singleton注解1178.2.10 Scope注解和Singleton注解的实现原理1188.2.11 日记列表模组依赖关係分析1208.2.12 创建日记列表模组Component1208.2.13 创建日记列表Presenter Module1218.2.14 Component的dependencies属性1238.3 存在的问题1258.3.1 学习成本极高1258.3.2 短期内开发效率低1258.3.3 灵活性不良好1268.4 小结126第9章 函式回响式框架:优雅的RxJava21279.1 什幺是RxJava1279.2 RxJava2的核心思想1289.2.1 函式回响式编程1289.2.2 背压1299.2.3 链式调用1299.3 实战:将RxJava2加入MVP1309.3.1 配置RxJava21309.3.2 Flowable1319.3.3 回响式拉取1329.3.4 修改数据源接口1339.3.5 修改本地数据源1339.3.6 Just操作符1349.3.7 Empty操作符1359.3.8 FromIterable操作符1359.3.9 To操作符1369.3.10 Subscriber和事件流1379.3.11 修改数据仓库1379.3.12 FlatMap操作符1399.3.13 Map操作符140 9.3.14 修改Presenter1419.3.15 CompositeDisposable和Disposable1429.3.16 Presenter生命周期1439.4 存在的问题1449.5 小结144第10章 AAC:搭建生命周期感知架构14510.1 什幺是AAC14510.2 AAC的核心思想14610.2.1 关注点分离14610.2.2 模型驱动界面14710.3 ViewModel+LiveData14810.3.1 DataBinding14810.3.2 Gradle依赖配置14910.3.3 AAC中的ViewModel14910.3.4 使用ViewModel15010.3.5 使用ViewModelProviders创建ViewModel15110.3.6 什幺是LiveData15210.3.7 MutableLiveData15310.3.8 创建LiveData15410.3.9 LiveData更新15510.3.10 LiveData接收变化15610.4 LifeCycle15610.4.1 生命周期15710.4.2 LifecycleObserver15810.4.3 LifecycleOwner15910.5 Room16010.5.1 Room的组成16010.5.2 实体16110.5.3 数据访问对象DAO16310.5.4 Room依赖配置16410.5.5 定义实体16410.5.6 创建Dao16510.5.7 创建资料库管理器16610.5.8 执行绪处理16810.5.9 修改本地数据源16910.5.10 资料库升级17210.6 小结173第11章 组件化架构:极速运行17411.1 什幺是组件化17411.2 组件化的核心思想17511.2.1 软体复用17511.2.2 信息隐藏17611.2.3 快速运行17711.3 组件分离17811.3.1 组件层级划分17811.3.2 组件划分17911.3.3 创建Module180 11.3.4 组件依赖关係18311.3.5 复用Gradle配置18711.3.6 公共资源组件18911.3.7 基础组件19111.3.8 移动依赖19411.3.9 Gradle版本号管理19411.3.10 处理Context19711.3.11 公共组件19811.3.12 日记列表展示组件20011.3.13 日记添加修改组件20211.3.14 Gradle Plugin冲突20411.3.15 运行主Module20411.4 使用路由20611.4.1 路由配置20611.4.2 使用Route跳转20711.4.3 携带参数跳转20811.5 组件运行21011.5.1 切换开关21011.5.2 组件配置21211.5.3 Manifest档案配置21211.5.4 集成运行21511.6 组件合併21611.6.1 组件命名冲突21611.6.2 Manifest档案合併策略21711.6.3 资源档案冲突21811.6.4 资源档案合併策略21911.7 小结220第12章 The Clean Architecture:整洁的架构22112.1 什幺是The Clean Architecture22112.2 The Clean Architecture的核心思想22212.2.1 单向依赖规则22212.2.2 业务规则分离22312.2.3 简单数据结构跨界22412.3 MVP-Clean架构22412.3.1 用例的请求数据和回响数据22412.3.2 用例的数据处理22612.3.3 用例的执行绪切换22812.3.4 创建用例22912.3.5 执行用例23012.3.6 封装请求数据23112.3.7 创建日记更新用例23412.3.8 重构日记修改Presenter23512.4 VIPER架构23812.4.1 什幺是VIPER架构23812.4.2 VIPER架构的层级划分239 12.4.3 创建Interactor24012.4.4 在协定中加入Interactor24112.4.5 使用Interactor24212.4.6 创建Router24212.4.7 在协定中加入Router24412.4.8 使用Router24412.5 Riblets架构24512.5.1 什幺是Riblets架构24512.5.2 Riblets架构的组件24612.6 小结247第13 Fragmentless:Fragment反对者24813.1 什幺是Fragmentless24813.2 Fragmentless实战24913.2.1 创建View24913.2.2 View附加状态判断25213.2.3 修改布局档案25313.2.4 修改Activity25413.3 小结255第14章 Conductor:短兵利刃25714.1 什幺是Conductor25714.2 Conductor实战25814.2.1 配置Conductor25914.2.2 Controller基类处理25914.2.3 重构Fragment26014.2.4 Controller的上下文26114.2.5 Controller活跃态26214.2.6 使用路由26214.2.7 日记修改页面处理26314.2.8 Controller构造方法26514.2.9 页面销毁26614.2.10 页面跳转26614.3 小结267第15章 外挂程式化:模组插拔26815.1 什幺是外挂程式化26815.2 外挂程式化实战26915.2.1 配置外挂程式化框架26915.2.2 配置主模组27015.2.3 验证环境配置27015.2.4 框架初始化27115.2.5 指定外挂程式类型27215.2.6 配置路由信息27215.2.7 创建载入页面27515.2.8 路由携带参数跳转27615.2.9 配置外挂程式的Launcher276 15.2.10 编译27715.3 小结278第16章 总结27916.1 架构演进27916.1.1 MVX系列架构27916.1.2 The Clean Architecture系列架构28016.1.3 模组化系列架构28116.2 选择合适的架构28216.2.1 认清你的团队规模28216.2.2 目前存在的问题28316.2.3 大型技术团队架构选型28316.2.4 中小型技术团队架构选型28416.2.5 独立开发者架构选型28516.3 复盘285