第 1章 基本设计原则 1
1.1 单一职责原则 2
1.1.1 简述 2
1.1.2 示例 3
1.1.3 小结 8
1.2 开闭原则 8
1.2.1 简述 8
1.2.2 示例 10
1.2.3 小结 13
1.3 依赖倒置原则 14
1.3.1 简述 14
1.3.2 示例 15
1.3.3 小结 17
1.4 里氏替换原则 17
1.4.1 简述 17
1.4.2 示例 18
1.4.3 小结 20
1.5 迪米特法则 20
1.5.1 简述 20
1.5.2 示例 21
1.5.3 小结 22
1.6 接口隔离原则 22
1.7 总结 24
第 2章 轻松应对后续的变化 27
2.1 抛出问题 27
2.2 问题分析 32
2.3 Spring中的PostProcessor机制 33
2.3.1 示例 33
2.3.2 思路抽象 38
2.4 设计优化 40
2.4.1 需求分析与设计 40
2.4.2 代码实现 41
2.5 总结 49
第3章 优雅地暴露内部属性 51
3.1 抛出问题 51
3.2 问题分析 58
3.2.1 违背设计原则 58
3.2.2 设计看似优雅,实则不然 59
3.3 Spring中的Aware机制 61
3.3.1 Aware概述 64
3.3.2 ApplicationContextAware的实现逻辑 65
3.3.3 思路抽象 67
3.3.4 优势分析 68
3.4 问题优化 71
3.5 总结 75
第4章 复杂逻辑的拆解与协同 77
4.1 抛出问题 77
4.2 问题分析 81
4.2.1 PostProcessor模式的错误选型 82
4.2.2 模板方法模式的错误选型 83
4.3 Tomcat中的PipeLine机制 87
4.3.1 Tomcat容器结构与协同处理 88
4.3.2 思路抽象 91
4.4 问题优化 93
4.4.1 设计优化 93
4.4.2 关键代码 94
4.4.3 链表与for循环的区别 101
4.5 总结 104
第5章 复用的人性化设计 105
5.1 抛出问题 105
5.2 问题分析 112
5.2.1 大量冗余代码 112
5.2.2 AOP切割原子逻辑 114
5.3 Spring中事务的封装与复用 118
5.3.1 Spring的事务处理 118
5.3.2 思路抽象 123
5.4 问题优化 125
5.4.1 注解设计 128
5.4.2 定义切面逻辑 129
5.4.3 定义拦截器 134
5.5 总结 137
第6章 屏蔽外部依赖的防火墙设计 139
6.1 抛出问题 139
6.2 问题分析 140
6.2.1 服务雪崩 140
6.2.2 逻辑入侵 146
6.3 思路抽象 149
6.4 问题优化 151
6.4.1 优化对接层 151
6.4.2 构建防腐层 152
6.5 总结 154
第7章 事件的分散性与协议化封装 157
7.1 抛出问题 157
7.2 问题分析 160
7.2.1 扩展类爆炸 160
7.2.2 扩展机制与监听机制的错用 161
7.3 WebSocket事件的封装与协议化 164
7.3.1 WebSocket 164
7.3.2 通信设计 166
7.3.3 思路抽象 171
7.4 问题优化 174
7.4.1 生产者视角 174
7.4.2 消费者视角 178
7.5 总结 182
第8章 基于Reactor模式的系统优化 185
8.1 抛出问题 185
8.2 问题分析 187
8.2.1 加机器 187
8.2.2 串行调用改为并发调用 187
8.2.3 预处理 188
8.3 Netty中的Reactor模式 188
8.3.1 Netty概述 188
8.3.2 BIO与NIO 189
8.3.3 Reactor编程模型 192
8.3.4 思路抽象 197
8.4 问题优化 199
8.4.1 方案设计 199
8.4.2 代码优化 201
8.5 总结 216
第9章 代码边界的延伸——善用SDK 217
9.1 抛出问题 217
9.2 问题分析与优化 217
9.2.1 SDK与API的区别 218
9.2.2 SDK可以解决的问题 219
9.2.3 SDK缺点与解决 221