內容簡介
本書力求將本書力求將
設計模式與實際開發緊密聯繫起來,具體講述了哪種模式可以在哪種現實的套用場景中採用。全書融入了作者多年的開發經驗,介紹了許多現實案例,具有很強的實用性。本書分為4篇:第1篇講述了面向對象設計的一些基本原則和.net引入的新概念;第2篇以gof的23種設計模式為主線用相當多的實例介紹了每一種設計模式的引入原因、動機、使用環境、結構及其收益與代價;第3篇介紹設計模式在dotnetnuke、nunit、ndoc和gentle等開放源碼中的套用;第4篇介紹了有關模式的歷史,如何發現和書寫模式,以及模式社會的交流場所plop等。
目錄
第1章 理解設計模式 3
1.1 模式的定義 3
1.2 gof的設計模式與模式 5
1.3 理解設計模式的名稱 5
1.3.1 工廠與工廠方法 6
1.3.2 生成器與生成器模式 6
1.3.3 橋接與橋接模式 6
1.3.4 狀態與狀態模式 6
1.3.6 裝飾器和裝飾器模式 7
1.3.7 代理和代理模式 7
1.4 理解設計模式的場景 7
1.5 理解設計模式中的作用力 9
1.6 理解設計模式的結果和代價 9
1.6.1 對象過多 9
1.6.2 更複雜的裝配關係 9
1.6.3 測試難度加大 10
1.6.4 程式結構複雜 10
1.7 設計模式不能做什麼 10
1.7.1 設計模式不是法則 10
.1.7.2 不能提高開發速度或者形象開發速度 10
1.7.3 不是萬能的 11
1.8 設計模式的非軟體示例 11
1.9 小結 13
第2章 uml與設計模式 14
2.1 gof設計模式中的圖示法 14
2.2 uml表示法 14
2.2.1 uml類圖 14
2.2.2 uml對象圖 18
2.2.3 uml序列圖 19
2.4 設計模式的邏輯模型和實現模型 20
2.5 使用case工具 22
2.6 小結 22
第3章 面向對象軟體設計的目標、原則和難點 23
3.1 軟體設計的目標 23
3.2 “開–閉”原則 24
3.3 實現“開–閉”原則 24
3.3.2 封裝變化 24
3.3.3 採用組合替代繼承 25
3.4 面向對象軟體設計的難點 26
3.5 設計模式解決的問題 27
3.5.1 通過顯示指定類創建對象 27
3.5.2 緊耦合 27
3.5.3 通過生成子類擴展功能 28
3.5.4 對對象表示或實現的依賴 28
3.5.5 不能方便地修改類 28
3.5.6 對算法的依賴 29
3.5.7 對軟硬體環境的依賴 29
3.6 小結 29
第4章 小題大做:人戴帽子——面向對象設計與設計模式 30
4.1 人戴帽子的需求 30
4.2 簡單方案 30
4.3 能否適應帽子種類的變化 32
4.4 人的行為可變性 32
4.5 誰給人戴帽子——在何處實例化對象 37
4.6 不戴帽子就不能游泳嗎——解耦 38
4.7 設計模型的適應性 40
4.8 人戴帽子:並非小題大做——面向對象設計與設計模式 41
4.8.1 模型回顧 41
4.8.2 遊戲建模 42
4.8.3 工作流中的角色與職責 42
4.9 小結 43
第5章 在.net平台下使用設計模式 45
5.1 .net概述 45
5.1.1 .net的組成 45
5.1.2 .net框架核心 46
5.1.3 clr 46
5.1.4 類庫 46
5.2 反射技術 47
5.2.1 .net可執行應用程式結構 47
5.2.2 反射技術示例 48
5.2.3 在設計模式實現中使用反射技術 50
5.3 委託技術 50
5.3.1 概述 50
5.3.2 示例 51
5.3.3 委託技術與gof設計模式中委託的關係 52
5.3.4 委託技術與設計模式實現 53
5.4 數據綁定 53
5.4.1 作用 53
5.4.2 windows窗體中的數據綁定 55
5.4.3 aspnet中的數據綁定 55
5.4.4 數據綁定與設計模式 56
5.5 對象的序列化 56
5.6 web套用中的技術 57
5.6.1 web窗體的狀態管理 57
5.6.2 cache 60
5.7 接口和類 61
5.7.1 icloneable 61
5.7.2 ienumerable和ienumerator 61
5.7.3 menucommand類與imenucommandservice接口 61
5.7.4 collectionbase類 61
5.7.5 idataadapter 61
5.8 小結 61
第2篇 設計模式的實現與使用
第6章 簡單工廠 65
6.2.2 使用場合 67
6.2.3 效果 67
6.3 .net實現 68
6.3.1 實現要點 68
6.3.3 代碼框架 69
6.5 獲得配置檔案訪問對象 71
6.5.1 問題 71
6.5.3 效果 73
6.6 獲得數據流訪問對象 74
6.6.1 問題 74
6.6.2 代碼 74
6.6.3 訪問web站點 74
6.7 簡單工廠的綜合套用 75
6.8 相關模式 75
第7章 工廠方法模式 76
7.1 引言 76
7.2 概述 77
7.2.1 意圖 77
7.2.2 使用場合 77
7.2.3 結構 77
7.2.4 效果 78
7.3 鳥生蛋的模化 78
7.4 .net中的工廠方法——獲得疊代器 78
7.5 獲得多媒體播放對象 79
7.6 相關模式 80
第8章 抽象工廠 81
8.1 引言 81
8.2 概述 82
8.2.1 意圖 82
8.2.2 使用場合 82
8.2.3 結構 82
8.2.4 實現示例 83
8.2.5 效果 84
8.3 資料庫訪問類的最佳化 85
8.4 抽象工廠在組態軟體中的套用 87
8.5 相關模式 89
第9章 .net的反射工廠 91
9.1 引言 91
9.2 採用反射技術簡化工廠類 92
9.3 反射工廠 93
9.3.1 對簡單工廠的改進 93
9.3.2 反射與工廠方法 94
9.3.3 反射與抽象工廠 94
9.4 反射工廠的套用實例 95
9.5 ndoc中的文檔生成器工廠 95
9.5.1 問題 95
9.5.2 分析 95
9.5.3 實現 96
9.5.4 效果 97
9.6 反射工廠的使用效果 97
9.7 小結 97
第10章 生成器 98
10.1 引言 98
10.2 概述 100
10.2.1 意圖 100
10.2.2 使用場合 100
10.2.3 結構 100
10.2.4 實現示例 101
10.2.5 效果 103
10.3 生成器模式與抽象工廠的區別 103
10.4 實現web資源管理軟體 105
10.5 支持windows套用和web套用的界面生成器 110
10.5.1 資料庫編輯界面的自動生成 110
10.5.2 同時支持web套用 112
10.5.5 web界面的生成器 116
10.6 生成器與生成器模式 118
10.7 相關模式 118
第11章 原型模式 119
11.1 引言 119
11.2 概述 120
11.2.1 意圖 120
11.2.2 使用場合 120
11.2.3 結構 120
11.2.4 效果 121
11.3 .net實現 121
11.3.1 icloneable接口 121
11.3.2 實現結構 121
11.3.3 深複製與淺複製 122
11.4 複製商品房銷售系統中樓盤 122
11.4.1 結構 122
11.4.2 強制類型集合 123
11.4.3 實現業務類 126
11.4.4 使用 127
11.4.5 效果 128
11.5 .net中的原型模式 128
11.6 創建自定義圖元 128
11.6.1 問題 128
11.6.2 解決方案 129
11.6.3 實現icloneable接口 129
11.6.4 構造工廠 130
11.6.5 狀態管理 131
11.6.6 實現橡皮筋 131
11.6.7 效果 133
11.7 總結 133
11.8 相關模式 133
第12章 專題——克隆圖 134
12.1 圖的結構 134
12.2 克隆圖的難點 136
12.3 實現 138
12.4 實例——矢量圖編輯軟體中的拷貝/貼上 139
12.5 小結 140
第13章 單件模式 141
13.1 概述 141
13.1.1 意圖 141
13.1.2 使用場合 141
13.1.3 結構 141
13.1.4 效果 141
13.2 .net實現 142
13.3 單件計數器 142
13.4 單件窗體 143
13.5 全局變數與單件 144
13.6 單件與實用類中的靜態方法 145
13.7 總結 145
13.8 相關模式 145
第14章 與對象創建相關的其他問題 146
14.1 構造函式 146
14.1.1 公共構造函式 146
14.1.2 私有構造函式 146
14.1.3 保護構造函式 147
14.1.4 靜態構造函式 147
14.2 僅通過工廠獲得實例 148
14.3 採用內部類封裝實現 149
14.4 註冊工廠 150
14.5 小結 151
第15章 適配器模式 152
15.1 概述 152
15.1.1 意圖 152
15.1.2 結構 152
15.1.3 使用場合 154
15.2 多媒體播放對象 154
15.3 套用系統間的接口 156
15.4 通信接口 159
15.6 .net中的適配器——dataadapter 160
15.7 相關模式 161
第16章 橋接模式 162
16.1 概述 162
16.1.1 意圖 162
16.1.2 使用場合 162
16.1.3 結構 162
16.1.4 效果 164
16.2 資料庫表編輯窗體——.net實現 164
16.3 多種數據源與多種數據顯示方式的組合 168
16.4 生成報表 170
16.5 相關模式 172
第17章 外觀模式 173
17.1 概述 173
17.1.1 意圖 173
17.1.2 使用場合 173
17.1.3 結構 173
17.1.4 效果 174
17.2 資料庫訪問外觀模式 175
17.3 分層結構與外觀模式 176
17.4 封裝子系統 177
17.5 子系統隔離 178
17.6 系統演化 178
17.7 相關模式 178
第18章 適配器模式、橋接模式與外觀模式 180
18.1 適配器模式與橋接模式的區別和聯繫 180
18.2 適配器模式與橋接模式的聯合 181
18.3 適配器模式與外觀模式的關係 182
18.4 小結 183
第19章 裝飾模式 184
19.1 引言 184
19.2 概述 186
19.2.1 意圖 186
19.2.2 結構 186
19.2.3 適用性 187
19.2.4 實現時的注意事項 187
19.2.5 效果 188
19.3 網頁組件裝飾器 188
19.4 bufferedstream——.net中的裝飾模式實例 191
19.5 裝飾≠裝飾模式——採用collectionbase實現強制類型集合 193
19.6 操作記錄 194
19.6.1 問題 194
19.6.2 結構 195
19.6.3 代碼實現 195
19.6.4 結果 197
19.7 改變外觀還是改變核心 197
19.8 相關模式 198
第20章 代理模式 199
20.1 引言 199
20.2 概述 200
20.2.1 意圖 200
20.2.2 使用場合 200
20.2.3 結構 201
20.2.4 結果 201
20.3 測試中的“占位”對象 202
20.4 .net中的代理模式——xmlweb service 205
20.5 .net中的代理模式——realproxy 206
20.6 去掉冗餘的許可權 208
20.6.1 問題 208
20.6.2 結構 209
20.6.3 代碼實現 209
20.6.4 結果 210
20.7 相關模式 210
第21章 組合模式 211
21.1 概述 211
21.1.1 意圖 211
21.1.2 使用場合 211
21.1.3 結構 211
21.1.4 效果 212
21.2 .net控制項——組合模式在.net中的實例 212
21.3 .net實現 214
21.3.1 組合模式的不同實現方式 214
21.3.2 強制類型集合或非強制類型集合 215
21.3.3 實現遞歸遍歷 215
21.4 複雜報表的指標樹 215
21.4.1 問題 215
21.4.2 結構 216
21.4.3 代碼 217
21.5 數據採集系統的顯示組件 219
21.5.1 問題 219
21.5.2 結構 219
21.5.3 效果 221
21.6 油品庫存模型 221
21.6.1 問題 221
21.6.2 結構 221
21.6.3 效果 222
21.7 mrp中的bom 222
21.7.1 問題 222
21.7.2 結構 222
21.7.3 效果 222
21.8 組合模式、裝飾模式和代理模式 222
21.9 與其他模式的關係 224
第22章 享元模式 225
22.1 概述 225
22.1.1 意圖 225
22.1.2 使用場合 225
22.1.3 結構 225
22.1.4 效果 226
22.2 html中的圖像——享元模式實例 226
22.3 圍棋 227
22.4 相關模式 232
第23章 享元模式與共享對象 233
23.1 什麼是共享對象 233
23.2 共享對象與註冊工廠 233
23.3 共享商品房類型 233
23.4 共享編輯窗體 235
23.5 小結 241
第24章 職責鏈模式 242
24.1 引言 242
24.2 概述 242
24.2.1 意圖 242
24.2.2 使用場合 242
24.2.3 結構 243
24.2.4 職責鏈模式構成與執行效率 243
24.2.5 結果 244
24.3 文法分析器——四則運算式解析 244
24.3.1 問題 244
24.3.2 方案 244
24.3.3 結果 250
24.4 計算後則表達式 250
24.4.1 問題 250
24.4.2 方案 250
24.4.3 結果 253
24.5 用於計算的職責鏈示例——計算所得稅 253
24.5.1 問題 253
24.5.2 方案 254
24.6 實現異常保護 257
24.6.1 問題 257
24.6.2 解決方案 258
24.6.3 結果 260
24.7 相關模式 260
第25章 命令模式 261
25.1 引言 261
25.2 概述 261
25.2.1 意圖 261
25.2.2 使用場合 261
25.2.3 結構 261
25.2.4 理解結構 262
25.2.5 效果 262
25.3 採用命令模式支持“取消”與“重做”功能 263
25.4 實現“取消”與“重做”功能 264
25.5 限制角色行為 265
25.6 iolecommandtarget接口與命令模式 269
25.6.1 iolecommandtarget 269
25.6.2 iolecommandtarget的調用 270
25.6.3 mshtml與iolecommandtarget接口 270
25.6.4 使用示例 273
25.6.5 結果 277
25.7 相關模式 277
第26章 解釋器模式 278
26.1 引言 278
26.2 語法規則、分析器和解釋器 278
26.3 概述 279
26.3.1 意圖 279
26.3.2 套用場合 279
26.3.3 結構 279
26.3.4 效果 280
26.4 簡單的機器人語言 280
26.5 創建機器人語言的解釋器 280
26.6 命令分析器與解釋器 285
26.7 相關模式 287
第27章 疊代器模式 288
27.1 概述 288
27.1.1 意圖 288
27.1.2 使用場合 288
27.1.3 結構 288
27.1.4 效果 289
27.2 .net中的疊代器模式 289
27.3 強制類型集合與疊代器模式 290
27.4 遍歷web快取 293
27.5 相關模式 293
第28章 備忘錄模式 294
28.1 引言 294
28.2 概述 294
28.2.1 意圖 294
28.2.2 結構 294
28.2.3 使用場合 295
28.2.4 效果 295
28.3 備忘錄模式的基本框架 295
28.4 實現要點分析 298
28.5 實現寬接口和窄接口 300
28.6 相關模式 302
第29章 狀態模式 303
29.1 概述 303
29.1.1 意圖 303
29.1.2 使用場合 303
29.1.3 結構 303
29.1.4 效果 304
29.2 狀態和狀態模式的進一步討論 304
29.3 冷暖空調的控制器 306
29.4 圖形編輯器中的狀態模式 308
29.5 實現用戶許可權的多態性 311
29.6 工作流與狀態模式 312
29.7 相關模式 313
第30章 觀察者模式 314
30.1 概述 314
30.1.1 意圖 314
30.1.2 使用場合 315
30.1.3 結構 315
30.1.4 效果 316
30.2 採用委託和事件機制實現觀察者模式 316
30.2.1 c#實現方法 317
30.2.2 採用withevents——vbnet的實現方法 318
30.2.3 與傳統實現方法比較 319
30.3 web查詢結構 320
30.4 e-mail和短訊息通知 323
30.5 事件連鎖 331
30.6 相關模式 332
第31章 中介者模式 333
31.1 概述 333
31.1.1 意圖 333
31.1.2 使用場合 333
31.1.3 結構 333
31.1.4 效果 334
31.2 採用委託技術簡化中介者模式的結構 334
31.3 .net中的中介者模式——窗體與窗體控制項 335
31.4 界面與業務類互動的中介者 337
31.4.1 編輯界面接口 337
31.4.2 數據訪問接口 338
31.4.3 中介者 338
31.4.4 實現 339
31.5 工作流與中介者模式 341
31.5.1 工作流簡介 341
31.5.2 工作流與中介者模式 342
31.6 相關模式 344
第32章 策略模式 345
32.1 引言 345
32.2 模式概述 345
32.2.1 意圖 345
32.2.2 使用場合 345
32.2.3 結構 346
32.2.4 效果 346
32.3 加密和解密 347
32.4 計算庫存下限 350
32.4.1 問題 350
32.4.2 結構 351
32.4.3 實現 351
32.5 採用委託技術的策略模式 354
32.6 相關模式 355
第33章 模板方法模式 356
33.1 引言 356
33.2 模式概述 356
33.2.1 意圖 356
33.2.2 使用場合 357
33.2.3 結構 357
33.2.4 效果 358
33.3 sql生成器——.net實現 358
33.4 通信程式中的模板方法 360
33.5 繪製圖形中的模板方法 361
33.6 採用委託實現模板方法 364
33.7 相關模式 365
第34章 訪問者模式 366
34.1 概述 367
34.1.1 意圖 367
34.1.2 使用場合 368
34.1.3 結構 368
34.1.4 效果 369
34.2 .net實現 370
34.3 訪問者模式與非強制類型集合 372
34.4 相關模式 378
第35章 訪問模式使用專題:訪問業務域模型 379
35.1 信息系統的組成 379
35.2 業務域模型 379
35.3 在子系統中使用業務域模型 380
35.4 採用訪問者模式為業務對象增加操作 381
35.5 小結 382
第36章 委託技術與行為型設計模式 383
36.1 封裝變化與面向接口編程 383
36.2 委託技術的使用場合 384
36.3 採用委託技術實現的設計模式 384
36.3.1 模板方法的結構 384
36.3.2 策略模式 386
36.3.3 中介者模式 387
36.3.4 觀察者模式 388
36.4 用組合替代繼承 389
36.5 設計模式的發展 389
36.6 小結 390
第3篇 開源項目中的設計模式
第37章 nunit中的設計模式 393
37.1 nunit結構組成與設計模式 393
37.2 簡單工廠 394
37.2.1 testcasebuilder 394
37.2.2 testsuitebuilder 396
37.3 組合模式 398
37.3.1 測試結果 399
37.4 模板方法——執行測試用例 400
37.5 測試用例的動態綁定 403
37.6 訪問者模式 404
37.7 裝飾器模式 407
37.7.1 封裝textwriter 407
37.7.2 作為treeview節點的test 408
37.8 適配器模式 410
37.9 觀察者模式 411
37.10 小結 414
第38章 dotnetnuke中的設計模式 415
38.1 dotnetnuke簡介 415
38.2 dotnetnuke與設計模式 415
38.3 採用反射技術的工廠方法 416
38.3.1 數據提供對象 416
38.3.2 創建業務邏輯對象 417
38.3.3 創建日誌記錄器 421
38.4 裝飾器模式——為模組提供容器 422
38.5 web套用中的命令模式——編輯選單 424
38.6 組合模式——欄目組成 426
38.7 享元模式 428
38.8 橋接模式——日誌記錄 430
38.9 策略模式——支持多種類型的html編輯器 432
38.10 觀察者模式——實現模組間通信 436
38.11 適配器模式——實現版本兼容 438
38.12 小結 439
第39章 gentle中的設計模式 440
39.1 模式一覽 440
39.2 採用反射的工廠方法 440
39.3 抽象工廠——針對不同資料庫的訪問提供者 441
39.4 組合模式——sql語句描述 445
39.5 疊代器模式——自定義cache的訪問 448
39.6 外觀模式 449
39.7 小結 450
第40章 log4net中的設計模式 451
40.1 log4net介紹 451
40.2 模式一覽 451
40.3 工廠方法 451
40.3.1 iloggerfactory 451
40.3.2 ipluginfactory 453
40.4 模板方法 454
40.5 橋接 456
40.6 職責鏈模式 457
40.7 適配器模式 459
40.8 原型模式 461
40.9 疊代器模式 462
40.10 小結 463
第4篇 模式與交流
第41章 在組織中使用設計模式 467
41.1 需求及其分析 467
41.2 設計模式在組織中的作用 467
41.3 將設計模式引入組織遇到的困難 468
41.4 將設計模式引入組織的方法 469
41.4.1 設定開發人員的知識體系 469
41.4.2 建立合理的培訓體制 469
41.4.3 重視項目的重構 469
41.4.4 逐漸將設計模式引入開發流程 470
第42章 發掘模式 471
42.1 為什麼要發掘模式 471
42.1.1 提高抽象能力 471
42.1.2 提高書面表達能力 471
42.1.3 有助於團隊意識的培養 472
42.2 發明還是發現 472
42.3 模式的範圍 473
42.3.1 方言 473
42.3.2 模式語言 473
42.4 如何發現模式 473
42.4.1 前提 473
42.4.2 確定範圍 473
42.4.3 明確問題及其所處的上下文 474
42.4.4 確定forces 474
42.4.5 描述解決方案 475
42.4.6 效果 475
42.4.7 模式名稱 476
42.4.8 模式的其他部分 476
42.5 模式的shepherd過程 476
42.6 模式的workshop 476
第43章 小組學習的範例——plop的workshop 477
43.1 傳統會議的不足 477
43.2 plop workshop的組織形式 477
43.3 plop workshop的優點 478
43.4 組織自己的workshop 478
第44章 模式的發展 479
44.1 模式的書寫方式和形成過程基本成熟 479
44.2 模式覆蓋的範圍越來越廣 479
44.3 越來越多的領域產生模式語言 480
44.4 模式發展的良性循環 480
附錄a 設計模式與設計模式組合速查 481
參考文獻 492
後記 495