产品特色
编辑推荐
CSDN社区专家精心撰写、业界专家邓凡平、郭霖、任玉刚、徐宜生等鼎力推荐Android源码讲解设计模式的书
《Android 源码设计模式解析与实战》不仅分析了Android源代码的设计模式,更结合实例演示了如何使用这些设计模式。看这本书,既能学到如何分析、学习Android源代码,又能提高自己架构设计水平
书中的主人公小民就是那些不断追求技术进步,从而得以不断成长的IT技术人的代表,小民的成长过程基本上反映了我们现在程序员的成长经历,他的成功很值得我们学习和借鉴。
内容简介
MVP模式。主要内容为:优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察者模式、备忘录模式、迭代器模式、模板方法模式、访问者模式、中介者模式、代理模式、组合模式、适配器模式、装饰模式、享元模式、外观模式、桥接模式,以及MVC的介绍与实战和MVP应用架构模式。每个章节都对某个模式做了深入的分析,并且会对模式相关的技术点进行深入拓展,让读者在掌握模式的同时学习到Android中的一些重要知识,通过实战帮助读者达到学以致用的目的,且能够将模式运用于项目中,开发出高质量的程序。
《Android 源码设计模式解析与实战》适合的读者为初、中、高级Android工程师,也可以作为大专院校相关师生的学习用书和培训学校的教材。
作者简介
CSDN博客专家,在开源社区做了大量的工作,贡献了许多模式设计的技术。
目录
第1章 走向灵活软件之路——
面向对象的六大原则 1
1.1 优化代码的第一步——
单一职责原则 1
1.2 让程序更稳定、更灵活——
开闭原则 5
1.3 构建扩展性更好的系统——
里氏替换原则 12
1.4 让项目拥有变化的能力——
依赖倒置原则 13
1.5 系统有更高的灵活性——
接口隔离原则 16
1.6 更好的可扩展性——
迪米特原则 18
1.7 总结 22
第2章 应用最广的模式——单例模式 23
2.1 单例模式介绍 23
2.2 单例模式的定义 23
2.3 单例模式的使用场景 23
2.4 单例模式UML类图 23
2.5 单例模式的简单示例 24
2.6 单例模式的其他实现方式 26
2.6.1 懒汉模式 26
2.6.2 Double CheckLock ( DCL )
实现单例 26
2.6.3 静态内部类单例模式 27
2.6.4 枚举单例 28
2.6.5 使用容器实现单例模式 28
2.7 Android源码中的单例模式 29
2.8 无名英雄——深入理解
LayoutInflater 33
2.9 运用单例模式 40
2.10 总结 42
第3章 自由扩展你的项目——
Builder模式 43
3.1 Builder模式介绍 43
3.2 Builder模式的定义 43
3.3 Builder模式的使用场景 43
3.4 Builder模式的UML类图 43
3.5 Builder模式的简单实现 44
3.6 Android源码中的Builder模式实现 46
3.7 深入了解WindowManager 52
3.8 Builder模式实战 59
3.9 总结 64
第4章 使程序运行更高效——
原型模式 66
4.1 原型模式介绍 66
4.2 原型模式的定义 66
4.3 原型模式的使用场景 66
4.4 原型模式的UML类图 66
4.5 原型模式的简单实现 67
4.6 浅拷贝和深拷贝 69
4.7 Android源码中的原型模式实现 72
4.8 Intent的查找与匹配 74
4.8.1 App信息表的构建 74
4.8.2 精确匹配 80
4.9 原型模式实战 83
4.10 总结 85
第5章 应用最广泛的模式——
工厂方法模式 87
5.1 工厂方法模式介绍 87
5.2 工厂方法模式的定义 87
5.3 工厂方法模式的使用场景 87
5.4 工厂方法模式的UML类图 87
5.5 模式的简单实现 90
5.6 Android源码中的工厂方法模式实现 93
5.7 关于onCreate方法 95
5.8 工厂方法模式实战 102
5.9 总结 105
第6章 创建型设计模式——
抽象工厂模式 106
6.1 抽象工厂模式介绍 106
6.2 抽象工厂模式的定义 106
6.3 抽象工厂模式的使用场景 106
6.4 抽象工厂模式的UML类图 106
6.5 抽象工厂方法模式的简单实现 109
6.6 Android源码中的抽象工厂
方法模式实现 112
6.7 总结 116
第7章 时势造英雄——策略模式 117
7.1 策略模式介绍 117
7.2 策略模式的定义 117
7.3 策略模式的使用场景 117
7.4 策略模式的UML类图 118
7.5 策略模式的简单实现 118
7.6 Android源码中的策略模式实现 123
7.6.1 时间插值器 123
7.6.2 动画中的时间插值器 124
7.7 深入属性动画 128
7.7.1 属性动画体系的总体设计 128
7.7.2 属性动画的核心类介绍 128
7.7.3 基本使用 129
7.7.4 流程图 130
7.7.5 详细设计 131
7.7.6 核心原理分析 131
7.8 策略模式实战应用 142
7.9 总结 144
第8章 随遇而安——状态模式 145
8.1 状态模式介绍 145
8.2 状态模式的定义 145
8.3 状态模式的使用场景 145
8.4 状态模式的UML类图 145
8.5 状态模式的简单示例 146
8.6 Wi-Fi管理中的状态模式 150
8.7 状态模式实战 159
8.8 总结 164
第9章 使编程更有灵活性——
责任链模式 165
9.1 责任链模式介绍 165
9.2 责任链模式的定义 165
9.3 责任链模式的使用场景 165
9.4 责任链模式的UML类图 165
9.5 责任链模式的简单实现 170
9.6 Android源码中的责任链模式实现 173
9.7 责任链模式实战 178
9.8 总结 181
第10章 化繁为简的翻译机——
解释器模式 182
10.1 解释器模式介绍 182
10.2 解释器模式的定义 182
10.3 解释器模式的使用场景 183
10.4 解释器模式的UML类图 184
10.5 解释器模式的简单实现 185
10.6 Android源码中的解释器模式实现 189
10.7 关于PackageManagerService 195
10.8 总结 203
第11章 让程序畅通执行——
命令模式 204
11.1 命令模式介绍 204
11.2 命令模式的定义 204
11.3 命令模式的使用场景 204
11.4 命令模式的UML类图 204
11.5 命令模式的简单实现 207
11.6 Android源码中的命令模式实现 211
11.7 Android事件输入系统介绍 214
11.8 命令模式实战 216
11.9 总结 223
第12章 解决、解耦的钥匙——
观察者模式 224
12.1 观察者模式介绍 224
12.2 观察者模式的定义 224
12.3 观察者模式的使用场景 224
12.4 观察者模式的UML类图 224
12.5 观察者模式的简单实现 225
12.6 Android源码分析 227
12.7 观察者模式的深入拓展 230
12.8 实战 238
12.9 总结 245
第13章 编程中的“后悔药”——
备忘录模式 247
13.1 备忘录模式介绍 247
13.2 备忘录模式的定义 247
13.3 备忘录模式的使用场景 247
13.4 备忘录模式的UML类图 247
13.5 备忘录模式的简单示例 248
13.6 Android源码中的备忘录模式 250
13.7 深度拓展 257
13.7.1 onSaveInstanceState调用
的时机 257
13.7.2 使用V4包存储状态的bug 257
13.8 实战 260
13.9 总结 267
第14章 解决问题的“第三者”——
迭代器模式 268
14.1 迭代器模式介绍 268
14.2 迭代器模式的定义 268
14.3 迭代器模式的使用场景 268
14.4 迭代器模式的UML类图 268
14.5 模式的简单实现 271
14.6 Android源码中的模式实现 275
14.7 总结 277
第15章 抓住问题核心——
模板方法模式 278
15.1 模板方法模式介绍 278
15.2 模板方法模式的定义 278
15.3 模板方法模式的使用场景 278
15.4 模板方法模式的UML类图 278
15.5 模板方法模式的简单示例 279
15.6 Android源码中的模板方法模式 281
15.7 深度拓展 283
15.8 模板方法实战 296
15.9 总结 299
第16章 访问者模式 301
16.1 访问者模式介绍 301
16.2 访问者模式的定义 301
16.3 访问者模式的使用场景 301
16.4 访问者模式的UML类图 301
16.5 访问者模式的简单示例 302
16.6 Android源码中的模式 306
16.7 访问者模式实战 309
16.8 总结 316
第17章 “和事佬”——中介者模式 317
17.1 中介者模式介绍 317
17.2 中介者模式的定义 318
17.3 中介者模式的使用场景 318
17.4 中介者模式的UML类图 318
17.5 中介者模式的简单实现 320
17.6 Android源码中的中介者模式实现 324
17.7 中介者模式实战 326
17.8 总结 329
第18章 编程好帮手——代理模式 330
18.1 代理模式介绍 330
18.2 代理模式的定义 330
18.3 代理模式的使用场景 330
18.4 代理模式的UML类图 330
18.5 代理模式的简单实现 332
18.6 Android源码中的代理模式实现 336
18.7 Android中的Bin
精彩书摘
《Android 源码设计模式解析与实战》:
开闭原则的英文全称是Open Close Principle,缩写是OCP,它是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的、灵活的系统。开闭原则的定义是:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是,对于修改是封闭的。在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会将错误引入原本已经经过测试的旧代码中,破坏原有系统。因此,当软件需要变化时,我们应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。当然,在现实开发中,只通过继承的方式来升级、维护原有系统只是一个理想化的愿景,因此,在实际的开发过程中,修改原有代码、扩展代码往往是同时存在的。
软件开发过程中,最不会变化的就是变化本身。产品需要不断地升级、维护,没有一个产品从第一版本开发完就再没有变化了,除非在下个版本诞生之前它已经被终止。而产品需要升级,修改原来的代码就可能会引发其他的问题。那么,如何确保原有软件模块的正确性,以及尽量少地影响原有模块,答案就是,尽量遵守本章讲述的开闭原则。
勃兰特·梅耶在1988年出版的《面向对象软件构造》一书中提出这一原则——开闭原则。这一想法认为,程序一旦开发完成,程序中一个类的实现只应该因错误而被修改,新的或者改变的特性应该通过新建不同的类实现,新建的类可以通过继承的方式来重用原类的代码。显然,梅耶的定义提倡实现继承,已存在的实现类对于修改是封闭的,但是新的实现类可以通过覆写父类的接口应对变化。
……
前言/序言
《深入探索:移动应用架构的基石与演进》 在日新月异的移动开发领域,技术的更新迭代速度令人目不暇接。然而,在这股洪流之下,一些经久不衰的原则与模式,如同基石一般,支撑着整个移动应用生态的稳健运行与持续发展。本书并非聚焦于某一特定操作系统或框架的源码细节,而是将目光投向更宏观、更普适的移动应用架构设计理念。我们致力于解构那些能够提升应用质量、可维护性、可扩展性和团队协作效率的核心设计思想,并结合丰富的实战经验,为开发者构建坚实的技术底蕴。 第一部分:架构设计的灵魂——模式的智慧 本部分将深入剖析在现代软件开发中,尤其是在复杂移动应用场景下,那些被证明行之有效的核心设计模式。我们将不仅仅停留在模式的定义与表象,更会深入探讨其产生的背景、解决的问题,以及在不同场景下的应用契机。 创建型模式: 从单例模式的精妙之处,到工厂方法与抽象工厂在解耦对象创建过程中的作用,再到建造者模式如何优雅地构建复杂对象,我们都将一一梳理。理解这些模式,有助于我们更好地管理对象的生命周期,减少硬编码,并为未来的配置变更预留空间。我们将探讨,如何在大型项目中,通过合理运用创建型模式,降低组件间的耦合度,提高代码的可复用性。例如,在一个需要频繁实例化不同类型数据库连接的场景下,工厂模式如何能将复杂的实例化逻辑隐藏起来,让上层业务代码更加简洁。 结构型模式: 适配器模式如何实现不兼容接口间的协同工作,装饰器模式如何动态地给对象添加功能,外观模式如何提供一个简化的接口来访问复杂子系统,以及代理模式在控制对象访问中的巧妙应用,都将是本部分的重点。我们将着重分析这些模式如何影响类的继承与组合关系,以及如何在不破坏现有结构的前提下,增加新的功能或改变对象的行为。例如,在处理网络请求时,代理模式如何被用来实现缓存、日志记录或权限控制,而无需修改原始的网络请求类。 行为型模式: 观察者模式在事件驱动架构中的核心地位,策略模式如何实现算法的灵活切换,模板方法模式如何定义算法的骨架而将具体实现留给子类,以及命令模式如何将请求封装成对象,都将得到细致的阐述。我们将强调这些模式如何在运行时,动态地改变对象的行为,实现代码的松耦合和高内聚。例如,在UI更新场景中,观察者模式如何让多个UI组件能够响应数据变化,而无需知道具体的数据源实现。 本部分的核心不在于死记硬背模式名称,而在于理解其背后的设计思想,并能够识别出在实际开发中,哪些场景适合应用这些模式,从而写出更健壮、更易于维护的代码。我们还将讨论一些在移动开发中非常常见但可能不属于经典23种设计模式范畴的“实践模式”,例如依赖注入、MVC、MVP、MVVM等架构模式,并探讨它们在不同应用场景下的优劣。 第二部分:架构演进的动力——实践与优化 在掌握了基础的设计模式之后,本部分将带领读者深入到更实际的应用层面,探讨如何将这些模式融会贯通,构建可维护、可扩展的移动应用架构,并关注在实际开发过程中可能遇到的性能瓶颈与优化策略。 可维护性与可扩展性: 我们将详细探讨如何通过模块化设计,将大型应用拆分成更小、更易于管理的模块,降低代码的复杂度和耦合度。依赖注入(DI)和控制反转(IoC)等概念将被深入解析,阐述它们如何在应用层面实现组件间的解耦,使得代码更易于测试和替换。我们将通过具体的案例,展示如何利用DI框架,有效地管理应用程序的依赖关系,从而大大提高代码的可测试性。 性能优化之路: 移动应用的性能直接关系到用户体验。本部分将聚焦于一些关键的性能优化技术,包括但不限于:内存管理与优化(如何避免内存泄漏、高效使用内存),UI渲染优化(如何减少绘制耗时、提升滑动流畅度),网络请求优化(如何减少请求次数、提高响应速度、处理弱网络环境),以及数据存储与访问优化。我们将分析常见的性能瓶颈产生的原因,并提供一套系统性的排查和优化思路。 测试驱动的开发(TDD)与单元测试: 良好的测试是保证代码质量的基石。本部分将强调TDD的理念,并通过实例讲解如何编写高质量的单元测试。我们将展示如何利用设计模式,使得代码更易于进行单元测试,例如,通过依赖注入,可以轻松地为依赖项提供模拟对象,从而隔离被测试单元。 代码质量与重构: 随着项目的迭代,代码不可避免地会产生“技术债务”。本部分将指导读者如何识别代码中的坏味道,以及如何运用各种重构技巧,在不改变代码外在行为的前提下,改善其内部结构。我们将重点介绍一些常用的重构手法,如提取方法、移动方法、替换继承为组合等,并说明这些重构与设计模式之间的内在联系。 跨平台与原生开发中的设计考量: 尽管本书不局限于特定平台,但我们也会适当讨论在进行跨平台开发(如使用Flutter、React Native等)时,需要注意的设计原则,以及原生开发(如iOS、Android)在架构设计上的独特考量。目标是让读者能够理解,无论采用何种技术栈,优秀的设计原则始终是相通的。 第三部分:架构进阶与未来趋势 本部分将进一步拓展读者的视野,探讨一些更高级的架构概念,以及移动应用开发领域未来的发展方向,帮助开发者保持技术的前瞻性。 微服务架构在移动后端中的应用(简述): 虽然主要关注客户端,但理解移动应用与之交互的后端架构,对于设计整体解决方案至关重要。我们将简要介绍微服务架构的思想,以及其如何影响移动端的设计。 函数式编程思想在现代开发中的融合: 函数式编程的理念,如不可变性、纯函数等,正在逐渐影响着命令式编程语言。本部分将探讨如何将这些思想融入移动应用开发,以期提高代码的健壮性和可理解性。 AI与机器学习在移动端的集成: 随着AI技术的飞速发展,如何在移动应用中集成AI能力,以及由此带来的架构设计挑战,也将进行探讨。 持续集成/持续部署(CI/CD)与自动化测试: 现代软件开发的流程离不开CI/CD。本部分将强调自动化测试在CI/CD流程中的关键作用,以及如何设计易于自动化的应用程序。 本书的独特价值: 本书最大的特点在于其“去源码化”和“重原理”。我们不纠结于某一个具体开源项目的内部实现细节,而是聚焦于那些能够被广泛应用的通用设计原则和模式。通过大量的实例、场景分析和对比,我们力求将抽象的设计理念具象化,让开发者能够真正理解“为什么”要这样设计,而不仅仅是“怎么”做。本书适合有一定移动开发基础,希望提升自身技术深度,构建更优秀、更具竞争力的移动应用的开发者。它将帮助您从“码农”蜕变为“架构师”,为您的职业发展奠定坚实的基础。 无论您是初入移动开发的新手,还是身经百战的资深工程师,阅读本书都将为您带来深刻的启发,帮助您在纷繁复杂的技术世界中,找到那条通往卓越代码的清晰路径。