第0章 漫談UML
UML
類圖
類和層次的關系
接口與實現
聚合
存取控制
類間的關聯(lián)性
順序圖
處理流程和對象間的協(xié)調
開始學習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的所有參與者
擴展自我視野的提示
邏輯可共享
父類跟子類的連續(xù)性
子類應視同父類
相關Pattern
進階說明:類層次與抽象類
父類對子類的要求
抽象類的意義
父類跟子類之間的協(xié)調
重點回顧
練習題
第4章 Factory Method(工廠方法)
建立對象實例交給子類
Factory Method Pattern
程序示例
Product類
Factory類
IDCard類
IDCardFactory類
Main類
Factory Method Pattern的所有參與者
擴展自我視野的提示
框架與內容
產生對象實例——方法的實現方式
Pattern利用與程序開發(fā)工程師之間的溝通
相關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的所有參與者
擴展自我視野的提示
先區(qū)分再擴充就很輕松
繼承是生死不離、委托是瀟灑分手
相關Pattern
重點回顧
練習題
第10章 Strategy(策略)——把算法整個換掉
Strategy Pattern
程序示例
Hand類
Strategy接口
WinningStrategy類
ProbStrategy類
Player類
Main類
Strategy Pattern的所有參與者
擴展自我視野的提示
為什么要特地建立Strategy參與者
執(zhí)行時也可切換
相關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)
可新增功能但內容不變
可新增動態(tài)功能
即使只有簡單的種類規(guī)劃,也可增加多種功能
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的所有參與者
擴展自我視野的提示
讓要求跟處理要求兩者間的結合關系不會太緊密
機動性改變連鎖形態(tài)
能更專心在自己的工作崗位上
轉送會不會導致處理變慢
相關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部分管理狀態(tài)
第17章 Observer(觀察者)——通知狀態(tài)變化
Observer Pattern
程序示例
Observer接口
NumberGenerator類
RandomNumberGenerator類
DigitObserver類
GraphObserver類
Main類
Observer Pattern的所有參與者
擴展自我視野的提示
這里也可對換
Observer的順序
Observer的行為影響Subiect時
如何處理更新的提示
“通知”的意義重于“觀察”
Model/View/Controller(MVC)
補充說明:java.util.Observer接口
相關Pattern
重點回顧
練習題
第18章 Memento(備忘錄)——存儲狀態(tài)
Memento Pattern
程序示例
Memento類
Gamer類
Main類
Memento Pattern的所有參與者
擴展自我視野的提示
2種接口(API)與存取控制
Memento可以有幾個
Memento有沒有使用期限
Caretaker參與者跟Originator參與者區(qū)隔使用的意義
相關Pattern
重點回顧
練習題
第19章 State(狀態(tài))——以類表示狀態(tài)
State Pattern
程序示例
金庫保安系統(tǒng)
不使用State Pattern的虛擬程序代碼
使用State Pattern的虛擬程序代碼
State接口
DayState類
NightState類
Context接口
SafeFrame類
Main類
State Pattern的所有參與者
擴展自我視野的提示
分割統(tǒng)合
有此狀態(tài)才會有的處理
狀態(tài)遷移該由誰管
不會有自我矛盾
新增狀態(tài)易如反掌
變化萬千的對象實例
相關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(解釋器)——以類來表達語法規(guī)則
Interpreter Pattern
迷你語言
迷你語言的命令
迷你程序示例
迷你語言的語法
終點表達式與非終點表達式
程序示例
Node類
ProgramNode類
CommandListNode類
CommandNode類
RepeatCommandNode類
PrimitiveCommandNode類
Context類
ParseException類
Main類
Interpreter Pattern的所有參與者
擴展自我視野的提示
還有其他不同的迷你語言嗎
略過/讀入
相關Pattern
重點回顧和最后的叮嚀
練習題
附錄
附錄A 練習題的解答
附錄B GoF的設計Pattern分類