第1篇 软件设计前奏篇
第1章 重新认识UMLt2
1.1 UML的定义t2
1.2 UML应用场景t2
1.3 UML基本构件简介t3
1.3.1 事物t3
1.3.2 关系t5
1.3.3 图t6
第2章 设计模式常用的UML图t7
2.1 类图t7
2.1.1 继承关系t8
2.1.2 实现关系t8
2.1.3 组合关系t9
2.1.4 聚合关系t10
2.1.5 关联关系t11
2.1.6 依赖关系t12
2.1.7 类关系记忆技巧t14
2.2 时序图t15
2.2.1 时序图的作用t15
2.2.2 时序图组成元素t16
2.2.3 时序图组合片段t17
2.2.4 时序图画法及应用实践t19
第3章 七大软件架构设计原则t22
3.1 开闭原则t22
3.1.1 开闭原则的定义t22
3.1.2 使用开闭原则解决实际问题t23
3.2 依赖倒置原则t24
3.2.1 依赖倒置原则的定义t24
3.2.2 使用依赖倒置原则解决实际问题t25
3.3 单一职责原则t28
3.3.1 单一职责原则的定义t28
3.3.2 使用单一职责原则解决实际问题t28
3.4 接口隔离原则t31
3.4.1 接口隔离原则的定义t31
3.4.2 使用接口隔离原则解决实际问题t31
3.5 迪米特法则t33
3.5.1 迪米特法则的定义t33
3.5.2 使用迪米特法则解决实际问题t33
3.6 里氏替换原则t35
3.6.1 里氏替换原则的定义t35
3.6.2 使用里氏替换原则解决实际问题t36
3.7 合成复用原则t40
3.7.1 合成复用原则的定义t40
3.7.2 使用合成复用原则解决实际问题t40
3.8 软件架构设计原则小结t42
第4章 关于设计模式的那些事儿t43
4.1 本书与GoF的《设计模式》的关系t43
4.2 为什么一定要学习设计模式t45
4.2.1 写出优雅的代码t45
4.2.2 好地重构项目t47
4.2.3 经典框架都在用设计模式解决问题t58
第2篇 创建型设计模式
第5章 简单工厂模式t60
5.1 工厂模式的历史由来t60
5.2 简单工厂模式概述t61
5.2.1 简单工厂模式的定义t61
5.2.2 简单工厂模式的应用场景t61
5.2.3 简单工厂模式的UML类图t61
5.2.4 简单工厂模式的通用写法t62
5.3 使用简单工厂模式封装产品创建细节t63
5.4 简单工厂模式在框架源码中的应用t66
5.4.1 简单工厂模式在JDK源码中的应用t66
5.4.2 简单工厂模式在Logback源码中的应用t67
5.5 简单工厂模式扩展t67
5.5.1 简单工厂模式的优点t67
5.5.2 简单工厂模式的缺点t67
第6章 工厂方法模式t68
6.1 工厂方法模式概述t68
6.1.1 工厂方法模式的定义t68
6.1.2 工厂方法模式的应用场景t69
6.1.3 工厂方法模式的UML类图t69
6.1.4 工厂方法模式的通用写法t70
6.2 使用工厂方法模式实现产品扩展t71
6.3 工厂方法模式在Logback源码中的应用t72
6.4 工厂方法模式扩展t73
6.4.1 工厂方法模式的优点t73
6.4.2 工厂方法模式的缺点t73
第7章 抽象工厂模式t74
7.1 抽象工厂模式概述t74
7.1.1 抽象工厂模式的定义t74
7.1.2 关于产品等级结构和产品族t75
7.1.3 抽象工厂模式的应用场景t76
7.1.4 抽象工厂模式的UML类图t76
7.1.5 抽象工厂模式的通用写法t76
7.2 使用抽象工厂模式解决实际问题t78
7.2.1 使用抽象工厂模式支持产品扩展t78
7.2.2 使用抽象工厂模式重构数据库连接池t81
7.3 抽象工厂模式在Spring源码中的应用t88
7.4 抽象工厂模式扩展t89
7.4.1 抽象工厂模式的优点t89
7.4.2 抽象工厂模式的缺点t90
第8章 单例模式t91
8.1 单例模式概述t91
8.1.1 单例模式的定义t91
8.1.2 单例模式的应用场景t91
8.1.3 单例模式的UML类图t92
8.1.4 单例模式的通用写法t92
8.2 使用单例模式解决实际问题t93
8.2.1 饿汉式单例写法的弊端t93
8.2.2 还原线程破坏单例的事故现场t93
8.2.3 双重检查锁单例写法闪亮登场t97
8.2.4 看似 的静态内部类单例写法t100
8.2.5 还原反射破坏单例模式的事故现场t101
8.2.6 加优雅的枚举式单例写法问世t103
8.2.7 还原反序列化破坏单例模式的事故现场t108
8.2.8 使用容器式单例写法解决大规模生产单例的问题t114
8.2.9 ThreadLocal单例详解t115
8.3 单例模式在框架源码中的应用t116
8.3.1 单例模式在JDK源码中的应用t116
8.3.2 单例模式在Spring源码中的应用t117
8.4 单例模式扩展t121
8.4.1 单例模式的优点t121
8.4.2 单例模式的缺点t121
第9章 原型模式t122
9.1 原型模式概述t122
9.1.1 原型模式的定义t122
9.1.2 原型模式的应用场景t123
9.1.3 原型模式的UML类图t124
9.1.4 原型模式的通用写法t124
9.2 使用原型模式解决实际问题t126
9.2.1 分析JDK浅克隆API带来的问题t126
9.2.2 使用序列化实现深克隆t129
9.2.3 还原克隆破坏单例的事故现场t131
9.3 原型模式在框架源码中的应用t132
9.3.1 原型模式在JDK源码中的应用t132
9.3.2 原型模式在Spring源码中的应用t133
9.4 原型模式扩展t134
9.4.1 原型模式的优点t134
9.4.2 原型模式的缺点t134
0章 建造者模式t135
10.1 建造者模式概述t135
10.1.1 建造者模式的定义t135
10.1.2 建造者模式的应用场景t136
10.1.3 建造者模式的UML类图t136
10.1.4 建造者模式的通用写法t137
10.2 使用建造者模式解决实际问题t138
10.2.1 建造者模式的链式写法t138
10.2.2 使用静态内部类实现建造者模式t140
10.2.3 使用建造者模式动态构建SQL语句t142
10.3 建造者模式在框架源码中的应用t153
10.3.1 建造者模式在JDK源码中的应用t153
10.3.2 建造者模式在MyBatis源码中的应用t154
10.3.3 建造者模式在Spring源码中的应用t154
10.4 建造者模式扩展t155
10.4.1 建造者模式与工厂模式的区别t155
10.4.2 建造者模式的优点t155
10.4.3 建造者模式的缺点t155
第3篇 结构型设计模式
1章 代理模式t158
11.1 代理模式概述t158
11.1.1 代理模式的定义t158
11.1.2 代理模式的应用场景t158
11.1.3 代理模式的UML类图t159
11.1.4 代理模式的通用写法t159
11.2 使用代理模式解决实际问题t161
11.2.1 从静态代理到动态代理t161
11.2.2 三层架构中的静态代理t163
11.2.3 使用动态代理实现无感知切换数据源t168
11.2.4 手写JDK动态代理核心原理t169
11.2.5 CGLib动态代理API原理分析t176
11.2.6 CGLib和JDK动态代理对比分析t183
11.3 代理模式在框架源码中的应用t184
11.3.1 代理模式在Spring源码中的应用t184
11.3.2 代理模式在MyBatis源码中的应用t185
11.4 代理模式扩展t189
11.4.1 静态代理和动态代理的区别t189
11.4.2 代理模式的优点t189
11.4.3 代理模式的缺点t190
2章 门面模式t191
12.1 门面模式概述t191
12.1.1 门面模式的定义t191
12.1.2 门面模式的应用场景t191
12.1.3 门面模式的UML类图t192
12.1.4 门面模式的通用写法t193
12.2 使用门面模式整合已知API的功能t194
12.3 门面模式在框架源码中的应用t196
12.3.1 门面模式在Spring源码中的应用t196
12.3.2 门面模式在MyBatis源码中的应用t198
12.3.3 门面模式在Tomcat源码中的应用t199
12.4 门面模式扩展t200
12.4.1 门面模式的优点t200
12.4.2 门面模式的缺点t200
3章 装饰器模式t201
13.1 装饰器模式概述t201
13.1.1 装饰器模式的定义t201
13.1.2 装饰器模式的应用场景t201
13.1.3 装饰器模式的UML类图t202
13.1.4 装饰器模式的通用写法t203
13.2 使用装饰器模式解决实际问题t205
13.2.1 使用装饰器模式解决煎饼“加码”问题t205
13.2.2 使用装饰器模式扩展日志格式输出t209
13.3 装饰器模式在框架源码中的应用t212
13.3.1 装饰器模式在JDK源码中的应用t212
13.3.2 装饰器模式在Sp
......
评论晒单