第0章 漫谈UML
UML
类图
类和层次的关系
接口与实现
聚合
存取控制
类间的关联性
顺序图
处理流程和对象间的协调
开始学习Design Patterns之前
Design Patterns不等于类函数库
不过,类函数库中确实用到Design Patterns
不要认为程序范例已经是完成品
图不能只是看,要仔细解读
自己仔细琢磨范例
了解角色功能——白雪公主给谁演
第1部分 先熟悉设计Pattern
第1章Iterator——迭代器
Iterator Pattern
程序示例
Aggregate接口
Iterator接口
Book类
BookShelf类
BookShelflterator类
Main类
Iterator Pattern的所有参与者
扩展自我视野的提示
无论实现结果如何,都能使用Iterator
抽象类、接口实在很难搞
Aggregate与Iterator的对应
“下一个”容易搞错
“最后一个"也容易错
一个以上的Iterator
各种iterator
不需要deletelterator
相关Pattern
重点回顾
练习题
第2章 Adaptel(适配器)——换个包装再度利用
Adapter Pattern
程序示例(1)(继承)
Banner类
Print接口
PrintBanner类
Main类
程序示例(2)(委托)
Print类
PrintBanner类
Adapter Pattern的所有参与者
扩展自我视野的提示
什么时候用
就算没有源程序也无妨
版本更新与兼容性
类差别太大
相关Pattern
重点回顾
练习题
第2部分 万事交给子类
第3章TempIate Method(模板方法)——实际处理就交给子类
Template Method Pattern
何谓模板(Template)
Template Method Pattern是什么
程序示例
AbstractDisplay类
CharDisplay类
StringDisplay类
Main类
Template Method Pattern的所有参与者
扩展自我视野的提示
逻辑可共享
父类跟子类的连续性
子类应视同父类
相关Pattern
进阶说明:类层次与抽象类
父类对子类的要求
抽象类的意义
父类跟子类之间的协调
重点回顾
练习题
第4章 Factory Method(工厂方法)
建立对象实例交给子类
Factory Method Pattern
程序示例
Product类
Factory类
IDCard类
IDCardFactory类
Main类
Factory Method Pattern的所有参与者
扩展自我视野的提示
框架与内容
产生对象实例——方法的实现方式
Pattern利用与程序开发工程师之间的沟通
相关Pattern
重点回顾
练习题
第3部分 建立对象实例
第5章 Singleton(单件)——惟一的对象实例
Singleton Pattern
程序示例
Singleton类
Main类
Singleton Pattern的所有参与者
扩展自我视野的提示
设限的理由
惟一对象实例产生的时间点
相关Pattern
重点回顾
练习题
第6章 Prototype(原型)——复制建立对象实例
Prototype Pattern
程序示例
Product接口
Manager类
MessageBox类
UnderlinePen类
Main类
Prototype Pattern的所有参与者
扩展自我视野的提示
难道真的不能利用类来建立对象实例吗
类名是一种束缚
相关Pattern
深入说明:clone方法和java.lang.Cloneable接口
Java语言的clone
Clone方法是在哪里定义
Cloneable所要求的方法是什么
Clone方法做的是浅拷贝(shallow copy)
重点回顾
练习题
第7章 Buildel(生成器)——组合复杂的对象实例
Builder PaRem
程序示例
Builder类
Director类
TextBuilder类
HTMLBuilder类
Main类
Builder PaRem的所有参与者
相关Pattern
扩展自我视野的提示
谁知道哪个部分
在设计时该决定哪些事、又不该决定哪些事
源代码的解读与修改
重点回顾
练习题
第8章 Abstract Factory(抽象工厂)——把相关零件组合成产品
Abstract Factory Pattern
程序示例
抽象零件:Item类
抽象零件:Link类
抽象零件:Tray类
抽象产品:Page类
抽象工厂:Factory类
利用工厂把零件组合成产品:Main类
具体工厂:ListFactory类
具体零件:ListLink类
具体零件:ListTray类
具体产品:ListPage类
在程序示例中新增其他的具体工厂
具体工厂:TableFactory类
具体零件:TableLink类
具体零件:TableTray类
具体产品:TablePage类
Abstract Factory Pattern的所有参与者
扩展自我视野的提示
新增具体工厂尤如探囊取物
新增零件很有难度
相关Pattern
深入说明:各种建立对象实例的手段
重点回顾
练习题
第4部分切割性思考
第9章 Bridge(桥接)——分成功能层次和实现层次
Bridge Pattern
类层次的两大责任
程序示例
功能的类层次:Display类
功能的类层次:CountDisplay类
实现的类层次:DisplayImpl类
实现的类层次:StringDisplaylmpl类
Main类
Bridge Pattern的所有参与者
扩展自我视野的提示
先区分再扩充就很轻松
继承是生死不离、委托是潇洒分手
相关Pattern
重点回顾
练习题
第10章 Strategy(策略)——把算法整个换掉
Strategy Pattern
程序示例
Hand类
Strategy接口
WinningStrategy类
ProbStrategy类
Player类
Main类
Strategy Pattern的所有参与者
扩展自我视野的提示
为什么要特地建立Strategy参与者
执行时也可切换
相关Pattern
重点回顾
练习题
第5部分 一视同仁
第11章 Comp05ite(组成)——对容器和内容一视同仁
Composite Pattern
程序示例
Entry类
File类
Directory类
FileTreatmentException类
Main类
Composite Pattern的所有参与者
扩展自我视野的提示
单一复数的一视同仁
add放在哪里
递归结构随时都会出现
相关Pattern
重点回顾
练习题
第12章 Decorator(装饰)——对装饰和内容一视同仁
Decorator Pattern
程序示例
Display类
StringDisplay类
Border类
SideBorder类
FuUBorder类
Main类
Decorator Pattern的所有参与者
扩展自我视野的提示
可穿透的接口(API)
可新增功能但内容不变
可新增动态功能
即使只有简单的种类规划,也可增加多种功能
java.io包和Decorator Pattern
小类多了一点
相关Pattern
深入说明:继承和委托的一视同仁
继承——对子类和父类一视同仁
委托——对自己和委托对象一视同仁
重点回顾
练习题
第6部分在结构中穿梭来去
第13章 Visitor(访问者)——在结构中穿梭还同时做事
Visitor Pattern
程序示例
Visitor类
Acceptor接口
Entry类
File类
Directory类
ListVisitor类
FileTreatmentException类
Main类
Visitor和Acceptor两边彼此调用
Visitor Pattern的所有参与者
扩展自我视野的提示
双重调度(double dispatch)
为什么要搞得这么复杂
The Open-Closed Principle——扩充时开放、修改时关闭
新增ConcreteVisitor参与者?简单
新增ConcreteAcceptor参与者?复杂
Visitor要怎样做才能进行处理
相关Pattern
重点回顾
练习题
第14章 Chain of Respons-biIity(职责链)——责任转送
Chain of Responsibility责任转送
程序示例
Trouble类
Support类
NoSupport类
LimitSupport类
OddSupport类
SpecialSupport类
Main类
Chain of Responsibility Pattern的所有参与者
扩展自我视野的提示
让要求跟处理要求两者间的结合关系不会太紧密
机动性改变连锁形态
能更专心在自己的工作岗位上
转送会不会导致处理变慢
相关Pattern
重点回顾
练习题
第7部分 简单最好
第15章 Facade(外观)——单一窗口
Facade单一窗口
程序示例
Database类
HtmlWriter类
PageMaker类
Main类
Facade Pattern的所有参与者
扩展自我视野的提示
Facade参与者到底在做什么事
Facade Pattern的递归应用
程序设计师拒绝使用Facade的理由——敏感的心理因素
相关Pattern
重点回顾
练习题
第16章 Mediator(中介者)——只要面对一个顾问
IvleQlator rattern
程序示例
Mediator接口
Colleague接口
ColleagueButton类
ColleagueTextField类
ColleagueCheckbox类
LoginFrame类
Main类
Mediator Pattern的所有参与者
扩展自我视野的提示
当分散变成灾难时
通讯路径数量暴增
哪些可以再利用
相关Pattern
重点回顾
练习题
第8部分管理状态
第17章 Observer(观察者)——通知状态变化
Observer Pattern
程序示例
Observer接口
NumberGenerator类
RandomNumberGenerator类
DigitObserver类
GraphObserver类
Main类
Observer Pattern的所有参与者
扩展自我视野的提示
这里也可对换
Observer的顺序
Observer的行为影响Subiect时
如何处理更新的提示
“通知”的意义重于“观察”
Model/View/Controller(MVC)
补充说明:java.util.Observer接口
相关Pattern
重点回顾
练习题
第18章 Memento(备忘录)——存储状态
Memento Pattern
程序示例
Memento类
Gamer类
Main类
Memento Pattern的所有参与者
扩展自我视野的提示
2种接口(API)与存取控制
Memento可以有几个
Memento有没有使用期限
Caretaker参与者跟Originator参与者区隔使用的意义
相关Pattern
重点回顾
练习题
第19章 State(状态)——以类表示状态
State Pattern
程序示例
金库保安系统
不使用State Pattern的虚拟程序代码
使用State Pattern的虚拟程序代码
State接口
DayState类
NightState类
Context接口
SafeFrame类
Main类
State Pattern的所有参与者
扩展自我视野的提示
分割统合
有此状态才会有的处理
状态迁移该由谁管
不会有自我矛盾
新增状态易如反掌
变化万千的对象实例
相关Pattern
重点回顾
练习题
第9部分 精简不浪费
第20章 Flyweight(享元)——有相同的部分就共享
采取精简政策
Flyweight Pattern
程序示例
BigChar类
BigCharFactory类
BigString类
Main类
Flyweight Pattern的所有参与者
扩展自我视野的提示
影响会传到所有相关位置
Intrinsic和extrinsic
管理中的对象实例不会被视为垃圾收集
非内存部分的记录
相关Pattern
重点回顾
练习题
第21章 Proxy(代理)——要用再建立
Proxy Pattern
程序示例
Printer类
Printable接口
PrinterProxy类
Main类
Proxy Pattern的所有参与者
扩展自我视野的提示
利用代理提高处理速度
不能让代理和本人合二为一吗
代理和委托
穿透性
HTTP proxy
各种Proxy
相关Pattern
重点回顾
练习题
第10部分 用类来表示
第22章 Command(命令)——将命令写成类
Command Pattern
程序示例
Command接口
MacroCommand类
DrawCommand类
Drawable接口
DrawCanvas类
Main类
Command Pattern的所有参与者
扩展自我视野的提示
命令应该要有的信息是什么
存储记录
转换器
相关Pattern
重点回顾
练习题
第23章 Interpreter(解释器)——以类来表达语法规则
Interpreter Pattern
迷你语言
迷你语言的命令
迷你程序示例
迷你语言的语法
终点表达式与非终点表达式
程序示例
Node类
ProgramNode类
CommandListNode类
CommandNode类
RepeatCommandNode类
PrimitiveCommandNode类
Context类
ParseException类
Main类
Interpreter Pattern的所有参与者
扩展自我视野的提示
还有其他不同的迷你语言吗
略过/读入
相关Pattern
重点回顾和最后的叮咛
练习题
附录
附录A 练习题的解答
附录B GoF的设计Pattern分类