商品详情
书名:设计模式之美
定*:99.8
ISBN:9787**5584748
作者:*争(@小争哥)
版次:第*版
出版时间:2022-06
内容提要:
本书结合真实项目案例,从面向对象编程范式、设计原则、代码规范、重构技巧和设计模式5个方面详细介绍如何编写*质量代码。
第*章为概述,简单介绍了本书涉及的各个模块,以及各个模块之间的联系;第2章介绍面向对象编程范式;第3章介绍设计原则;第4章介绍代码规范;第5章介绍重构技巧;第6章介绍*建型设计模式;第7章介绍结构型设计模式;第8章介绍行为型设计模式。
本书可以作为各类研发工程师的学习、进*读物,也可以作为*等院校相关*业师生的教学和学习用书,以及计算机培训学校的教材。
作者简介:
*争,前Google工程师,《数据结构与算法之美》书籍作者,热衷技术分享,gzh:小争哥。热爱分享,对数据结构、设计模式和算法有很好的的研究。
量身打造
目录:
第 *章概述 *
*.* 为什么学习代码设计 2
*.*.* 编写*质量的代码 2
*.*.2 应对复杂代码的开发 2
*.*.3 程序员的基本功 3
*.*.4 职场发展的*备技能 4
*.*.5 思考题 4
*.2 如何评*代码质量 4
*.2.* 可维护性(maintainability) 5
*.2.2 可读性(readability) 6
*.2.3 可扩展性(extensibility) 6
*.2.4 灵活性(flexibility) 6
*.2.5 简洁性(simplicity) 7
*.2.6 可复用性(reusability) 7
*.2.7 可测试性(testability) 7
*.2.8 思考题 8
*.3 如何写出*质量代码 8
*.3.* 面向对象 8
*.3.2 设计原则 8
*.3.3 设计模式 9
*.3.4 代码规范 9
*.3.5 重构技巧 *0
*.3.6 思考题 **
*.4 如何避*过度设计 **
*.4.* 代码设计的初衷是提*代码质量 **
*.4.2 代码设计的原则是“先有问题,后有方案” *2
*.4.3 代码设计的应用场景是复杂代码 *2
*.4.4 持续重构可有效避*过度设计 *2
*.4.5 *要脱离具体的场景谈代码设计 *3
*.4.6 思考题 *3
第 2章面向对象编程范式 *4
2.* 当我们在谈论面向对象时,到底在谈论什么 *5
2.*.* 面向对象编程和面向对象编程语言 *5
2.*.2 非严格定义的面向对象编程语言 *6
2.*.3 面向对象分析和面向对象设计 *6
2.*.4 关于UML的说明 *7
2.*.5 思考题 *7
2.2 封装、抽象、继承和多态为何而生 *7
2.2.* 封装(encapsulation) *8
2.2.2 抽象(abstraction) 20
2.2.3 继承(inheritance) 2*
2.2.4 多态(polymorphism) 22
2.2.5 思考题 25
2.3 如何进行面向对象分析、面向对象设计和面向对象编程 25
2.3.* 案例介绍和难点剖析 25
2.3.2 如何进行面向对象分析 26
2.3.3 如何进行面向对象设计 28
2.3.4 如何进行面向对象编程 34
2.3.5 思考题 35
2.4 面向对象编程与面向过程编程和函数式编程之间的区别 35
2.4.* 面向过程编程 36
2.4.2 面向对象编程和面向过程编程的对比 38
2.4.3 函数式编程 40
2.4.4 面向对象编程和函数式编程的对比 44
2.4.5 思考题 44
2.5 哪些代码看似面向对象编程风格,实则面向过程编程风格 45
2.5.* 滥用getter、setter方法 45
2.5.2 滥用*局变量和*局方法 47
2.5.3 定义数据和方法分离的类 49
2.5.4 思考题 50
2.6 基于“贫血”模型的传统开发模式是否违背OOP 5*
2.6.* 基于“贫血”模型的传统开发模式 5*
2.6.2 基于“充血”模型的DDD开发模式 52
2.6.3 两种开发模式的应用对比 53
2.6.4 基于“贫血”模型的传统开发模式被广泛应用的原因 57
2.6.5 基于“充血”模型的DDD开发模式的应用场景 58
2.6.6 思考题 59
2.7 接口和抽象类:如何使用普通类模拟接口和抽象类 59
2.7.* 抽象类和接口的定义与区别 59
2.7.2 抽象类和接口存在的意义 62
2.7.3 模拟实现抽象类和接口 64
2.7.4 抽象类和接口的应用场景 65
2.7.5 思考题 65
2.8 基于接口而非实现编程:有没有*要为每个类*定义接口 65
2.8.* 接口的多种理解方式 66
2.8.2 设计思想实战应用 66
2.8.3 避*滥用接口 69
2.8.4 思考题 69
2.9 组合*于继承:什么情况下可以使用继承 70
2.9.* 为什么*推荐使用继承 70
2.9.2 相比继承,组合有哪些*势 72
2.9.3 如何决定是使用组合还是使用继承 73
2.9.4 思考题 74
第3章设计原则 75
3.* 单*职责原则:如何判定某个类的职责是否单* 76
3.*.* 单*职责原则的定义和解读 76
3.*.2 如何判断类的职责是否单* 76
3.*.3 类的职责是否越细化越好 78
3.*.4 思考题 79
3.2 开闭原则:只要修改代码,**定违反开闭原则吗 79
3.2.* 如何理解“对扩展开放、对修改关闭” 80
3.2.2 修改代码*意味着违反开闭原则吗 83
3.2.3 如何做到“对扩展开放、对修改关闭” 84
3.2.4 如何在项目中灵活应用开闭原则 85
3.2.5 思考题 86
3.3 里氏替换原则:什么样的代码才算违反里氏替换原则 86
3.3.* 里氏替换原则的定义 86
3.3.2 里氏替换原则与多态的区别 88
3.3.3 违反里氏替换原则的反模式 89
3.3.4 思考题 89
3.4 接口隔离原则:如何理解该原则中的“接口” 89
3.4.* 把“接口”理解为*组API或函数 90
3.4.2 把“接口”理解为单个API或函数 9*
3.4.3 把“接口”理解为OOP中的接口概念 92
3.4.4 思考题 96
3.5 依赖反转原则:依赖反转与控制反转、依赖注入有何关系 97
3.5.* 控制反转(IoC) 97
3.5.2 依赖注入(DI) 98
3.5.3 依赖注入框架(DI Framework) 99
3.5.4 依赖反转原则(DIP) *00
3.5.5 思考题 *00
3.6 KISS原则和YAGNI原则:二者是*回事吗 *00
3.6.* KISS原则的定义和解读 *0*
3.6.2 代码并非行数越少越简单 *0*
3.6.3 代码复杂**定违反KISS原则 *03
3.6.4 如何写出满足KISS原则的代码 *04
3.6.5 YAGNI原则和KISS原则的区别 *04
3.6.6 思考题 *04
3.7 DRY原则:相同的两段代码**定违反DRY原则吗 *04
3.7.* 代码逻辑重复 *05
3.7.2 功能(语义)重复 *06
3.7.3 代码执行重复 *07
3.7.4 代码的复用性 *09
3.7.5 思考题 **0
3.8 LoD:如何实现代码的“*内聚、低耦合” **0
3.8.* 何为“*内聚、低耦合” **0
3.8.2 LoD的定义描述 ***
3.8.3 定义解读与代码示例* **2
3.8.4 定义解读与代码示例二 **4
3.8.5 思考题 **6
第4章代码规范 **7
4.* 命名与注释:如何*准命名和编写注释 **8
4.*.* 长命名和短命名哪个更好 **8
4.*.2 利用上下文信息简化命名 **8
4.*.3 利用业务词汇表统*命名 **8
4.*.4 命名既要*准又要抽象 **9
4.*.5 注释应该*含哪些内容 **9
4.*.6 注释并非越多越好 *20
4.*.7 思考题 *20
4.2 代码风格:与其争论标准,*如团队统* *2*
4.2.* 类、函数多大才合适 *2*
4.2.2 *行代码多长才合适 *2*
4.2.3 善用空行分割代码块 *2*
4.2.4 是四格缩进还是两格缩进 *22
4.2.5 左大括号是否要另起*行 *22
4.2.6 类中成员的排列顺序 *22
4.2.7 思考题 *23
4.3 编程技巧:小技巧,大作用,*招提*代码的可读性 *23
4.3.* 将复杂的代码模块化 *23
4.3.2 避*函数的参数过多 *24
4.3.3 移除函数中的flag参数 *25
4.3.4 移除嵌套过深的代码 *26
4.3.5 学会使用解释性变量 *28
4.3.6 思考题 *29
第5章重构技巧 *30
5.* 重构四要素:目的、对象、时机和方法 *3*
5.*.* 重构的目的:为什么重构(why) *3*
5.*.2 重构的对象:到底重构什么(what) *3*
5.*.3 重构的时机:什么时候重构(when) *32
5.*.4 重构的方法:应该如何重构(how) *32
5.*.5 思考题 *33
5.2 单元测试:*证重构*出错的有效手段 *33
5.2.* 什么是单元测试 *33
5.2.2 为什么要编写单元测试代码 *35
5.2.3 如何设计单元测试 *36
5.2.4 为什么单元测试落地困难 *38
5.2.5 思考题 *39
5.3 代码的可测试性:如何编写可测试代码 *39
5.3.* 编写可测试代码的方法 *39
5.3.2 常见*可测试代码示例 *46
5.3.3 思考题 *47
5.4 解耦:哪些方法可以用来解耦代码 *47
5.4.* 为何解耦如此重要 *47
5.4.2 如何判断代码是否需要解耦 *48
5.4.3 如何给代码解耦 *48
5.4.4 思考题 *50
5.5 重构案例:将ID生成器代码从“能用”重构为“好用” *50
5.5.* ID生成器需求背景 *50
5.5.2 “凑合能用”的代码实现 *5*
5.5.3 如何发现代码的质量问题 *52
5.5.4 第 *轮重构:提*代码的可读性 *53
5.5.5 第二轮重构:提*代码的可测试性 *55
5.5.6 第三轮重构:编写单元测试代码 *56
5.5.7 第四轮重构:重构异常处理逻辑 *58
5.5.8 思考题 *65
第6章*建型设计模式 *66
6.* 单例模式(上):为什么*推荐在项目中使用单例模式 *67
6.*.* 单例模式的定义 *67
6.*.2 单例模式的实现方法 *67
6.*.3 单例模式的应用:日志写入 *70
6.*.4 单例模式的弊端 *73
6.*.5 单例模式的替代方案 *75
6.*.6 思考题 *76
6.2 单例模式(下):如何设计实现*个分布式单例模式 *77
6.2.* 单例模式的唯*性 *77
6.2.2 线程唯*的单例模式 *77
6.2.3 集群环境下的单例模式 *78
6.2.4 多例模式 *79
6.2.5 思考题 *80
6.3 工厂模式(上):如何解耦复杂对象的*建和使用 *80
6.3.* 简单工厂模式(Simple Factory Pattern) *8*
6.3.2 工厂方法模式(Factory Method Pattern) *83
6.3.3 抽象工厂模式(Abstract Factory Pattern) *86
6.3.4 工厂模式的应用场景总结 *87
6.3.5 思考题 *87
6.4 工厂模式(下):如何设计实现*个依赖注入容器 *88
6.4.* DI容器与工厂模式的区别 *88
6.4.2 DI容器的核心功能 *88
6.4.3 DI容器的设计与实现 *90
6.4.4 思考题 *94
6.5 建造者模式:什么情况下*须用建造者模式*建对象 *94
6.5.* 使用构造函数*建对象 *94
6.5.2 使用setter方法为成员变量赋值 *95
6.5.3 使用建造者模式做参数校验 *96
6.5.4 建造者模式在Guava中的应用 *98
6.5.5 建造者模式与工厂模式的区别 200
6.5.6 思考题 200
6.6 原型模式:如何快速复制(clone)*个哈希表 200
6.6.* 原型模式的定义 200
6.6.2 原型模式的应用举例 20*
6.6.3 原型模式的实现方式:深拷贝和浅拷贝 203
6.6.4 思考题 206
第7章结构型设计模式 208
7.* 代理模式:代理模式在RPC、缓存和监控等场景中的应用 209
7.*.* 基于接口实现代理模式 209
7.*.2 基于继承实现代理模式 2**
7.*.3 基于反射实现动态代理 2**
7.*.4 代理模式的各种应用场景 2*2
7.*.5 思考题 2*3
7.2 装饰器模式:剖析Java IO类库的底层设计思想 2*3
7.2.* Java IO类库的“奇怪”用法 2*3
7.2.2 基于继承的设计方案 2*5
7.2.3 基于装饰器模式的设计方案 2*5
7.2.4 思考题 2*9
7.3 适配器模式:如何利用适配器模式解决代码的*兼容问题 2*9
7.3.* 类适配器和对象适配器 2*9
7.3.2 适配器模式的5种应用场景 22*
7.3.3 适配器模式在Java日志中的应用 224
7.3.4 Wrapper设计模式 226
7.3.5 思考题 230
7.4 桥接模式:如何将M×N的继承关系简化为M+N的组合关系 230
7.4.* 桥接模式的定义 230
7.4.2 桥接模式解决继承“*炸”问题 230
7.4.3 思考题 23*
7.5 门面模式:如何设计接口以兼顾接口的易用性和通用性 23*
7.5.* 门面模式和接口设计 23*
7.5.2 利用门面模式提*接口易用性 232
7.5.3 利用门面模式提*接口性能 232
7.5.4 利用门面模式解决事务问题 232
7.5.5 思考题 233
7.6 组合模式:*种应用在树形结构上的*殊设计模式 233
7.6.* 组合模式的应用*:目录树 233
7.6.2 组合模式的应用二:人力树 237
7.6.3 思考题 239
7.7 享元模式:如何利用享元模式降低系统的内存开销 239
7.7.* 享元模式在棋牌游戏中的应用 239
7.7.2 享元模式在文本编辑器中的应用 242
7.7.3 享元模式在Java Integer中的应用 244
7.7.4 享元模式在Java String中的应用 247
7.7.5 享元模式与单例模式、缓存、对象池的区别 248
7.7.6 思考题 248
第8章行为型设计模式 249
8.* 观察者模式:如何实现*个异步非阻塞的EventBus框架 250
8.*.* 观察者模式的定义 250
8.*.2 观察者模式的代码实现 250
8.*.3 观察者模式存在的意义 25*
8.*.4 观察者模式的应用场景 253
8.*.5 异步非阻塞观察者模式 254
8.*.6 EventBus框架功能介绍 255
8.*.7 从零开始实现EventBus框架 257
8.*.8 思考题 26*
8.2 模板方法模式(上):模板方法模式在JDK、Servlet、JUnit中的应用 26*
8.2.* 模板方法模式的定义与实现 26*
8.2.2 模板方法模式的作用*:复用 262
8.2.3 模板方法模式的作用二:扩展 264
8.2.4 思考题 266
8.3 模板方法模式(下):模板方法模式与回调有何区别和联系 267
8.3.* 回调的原理与实现 267
8.3.2 应用示例*:JdbcTemplate 268
8.3.3 应用示例二:setClickListener() 270
8.3.4 应用示例三:addShutdownHook() 27*
8.3.5 模板方法模式与回调的区别 272
8.3.6 思考题 273
8.4 策略模式:如何避*冗长的if-else和switch-case语句 273
8.4.* 策略模式的定义与实现 273
8.4.2 利用策略模式替代分支判断 275
8.4.3 策略模式的应用举例:对文件中的内容进行排序 277
8.4.4 避*策略模式误用 28*
8.4.5 思考题 28*
8.5 职责链模式:框架中的过滤器、拦截器和插件是如何实现的 282
8.5.* 职责链模式的定义和实现 282
8.5.2 职责链模式在敏感词过滤中的应用 286
8.5.3 职责链模式在Servlet Filter中的应用 288
8.5.4 职责链模式在Spring Interceptor中的应用 290
8.5.5 职责链模式在MyBatis Plugin中的应用 293
8.5.6 思考题 297
8.6 状态模式:游戏和工作流引擎中常用的状态机是如何实现的 297
8.6.* 什么是有限状态机 298
8.6.2 状态机实现方式*:分支判断法 300
8.6.3 状态机实现方式二:查表法 30*
8.6.4 状态机实现方式三:状态模式 303
8.6.5 思考题 306
8.7 迭代器模式(上):为什么要用迭代器遍历集合 306
8.7.* 迭代器模式的定义和实现 307
8.7.2 遍历集合的3种方法 309
8.7.3 迭代器遍历集合的问题 3*0
8.7.4 迭代器遍历集合的问题的解决方案 3**
8.7.5 思考题 3*5
8.8 迭代器模式(下):如何实现*个支持快照功能的迭代器 3*5
8.8.* 支持快照功能的迭代器 3*5
8.8.2 设计思路*:基于多副本 3*6
8.8.3 设计思路二:基于时间戳 3*7
8.8.4 思考题 3*9
8.9 访问者模式:为什么支持双分派的编程语言*需要访问者模式 320
8.9.* “发明”访问者模式 320
8.9.2 双分派(Double Dispatch) 328
8.9.3 思考题 330
8.*0 备忘录模式:如何*雅地实现数据*丢失、撤销和恢复功能 330
8.*0.* 备忘录模式的定义与实现 33*
8.*0.2 *化备忘录模式的时间和空间开销 333
8.*0.3 思考题 334
8.** 命令模式:如何设计实现基于命令模式的手游服务器 334
8.**.* 命令模式的定义 334
8.**.2 命令模式的应用:手游服务器 335
8.**.3 命令模式与策略模式的区别 336
8.**.4 思考题 337
8.*2 解释器模式:如何设计实现*个自定义接口告警规则的功能 337
8.*2.* 解释器模式的定义 337
8.*2.2 解释器模式的应用:表达式计算 337
8.*2.3 解释器模式的应用:规则引擎 340
8.*2.4 思考题 343
- 人民邮电出版社有限公司 (微信公众号认证)
- 人民邮电出版社微店,为您提供最全面,最专业的一站式购书服务
- 扫描二维码,访问我们的微信店铺
- 随时随地的购物、客服咨询、查询订单和物流...