导读 1
第1篇 预备知识—发掘用C#语言进行面向对象化设计的潜力 1
第1章 重新研读C#语言 3
1.1 说明 4
1.2 C#部分语法内容扩展 4
1.2.1 命名空间(Namespace) 4
1.2.2 简洁的异步通知机制—委托(Delegate) 6
1.2.3 考验你的算法抽象能力—泛型(Generics) 12
1.2.4 用作标签的方式扩展对象特性—属性(Attribute) 18
1.2.5 用索引器简化的C#类型信息访问 22
1.2.6 融入C#语言的迭代机制—迭代器(Iterator) 29
1.3 可重载运算符(Overloadable Operators)与转换运算符(Conversion Operators) 35
1.3.1 The Day After Someday 35
1.3.2 用于有限的状态迭代 35
1.3.3 操作集合 36
1.3.4 类型的适配 37
1.3.5 小结 38
1.4 面向插件架构和现场部署的配置系统设计 39
1.4.1 认识.NET Framework提供的主要配置实体类 40
1.4.2 应用实例 41
1.4.3 小结 48
1.5 实现依赖注入 48
1.5.1 背景介绍 48
1.5.2 示例情景 48
1.5.3 Constructor注入 51
1.5.4 Setter注入 51
1.5.5 接口注入 52
1.5.6 基于Attribute实现注入—Attributer 53
1.5.7 小结 55
第2章 开始每个设计模式之前 57
2.1 new()的替代品 59
2.2 准备一个轻量的内存Cache 61
2.3 准备一个集中访问配置文件的Broker 64
2.4 Web?Not Web? 67
2.5 小结 71
第2篇 创建型模式—管理并隔离对象—的构造过程 73
第3章 工厂&工厂方法模式 75
3.1 简单工厂 76
3.1.1 最简单的工厂类 76
3.1.2 根据规格加工产品—参数化工厂 79
3.1.3 简单工厂的局限性 80
3.2 经典回顾 80
3.3 解耦Concrete Factory与客户程序 82
3.4 基于配置文件的Factory 83
3.5 批量工厂 85
3.5.1 开发情景 85
3.5.2 定义产品类型容器 87
3.5.3 定义批量工厂和产品类型容器 88
3.5.4 增设生产指导顾问—Director 89
3.5.5 由Director指导的客户程序 90
3.6 基于类型参数的Generic Facto 91
3.7 委托工厂类型 94
3.8 小结 95
第4章 单件模式 97
4.1 经典回顾 99
4.2 线程安全的Singleton 102
4.3 细节决定成败 103
4.4 细颗粒度Singleton 105
4.4.1 背景讨论 105
4.4.2 解决桌面应用中细颗粒度Singleton问题 105
4.4.3 解决Web应用中细颗粒度Singleton问题 107
4.4.4 更通用的细颗粒度Singleton 108
4.5 自动更新的Singleton 110
4.6 参数化的Singleton 110
4.7 跨进程的Singleton 112
4.8 Singleton的扩展—Singleton-N 114
4.8.1 定义具有执行状态的抽象对象 115
4.8.2 定义相应的Singleton-N实例集合 115
4.8.3 在基本Singleton模式实现的框架下引入实例集合 116
4.9 引入配置文件管理Singleton 117
4.10 基于类型参数的Generic Singleton 118
4.11 由工厂类型协助Singleton实例管理 119
4.12 小结 120
第5章 抽象工厂模式 121
5.1 经典回顾 122
5.2 按计划实施生产 125
5.2.1 为抽象工厂补充类型映射器 125
5.2.2 处理模式的硬伤 127
5.3 定义计划与生产间的映射关系 128
5.3.1 分析 128
5.3.2 登记映射关系 129
5.3.3 用TypeMapper协助工厂生产 129
5.3.4 定义实体TypeMapper和实体工厂 130
5.3.5 实现装配机制 130
5.4 配置生产计划 131
5.5 基于Delegate的生产外包 134
5.6 小结 136
第6章 创建者模式 139
6.1 经典回顾 141
6.2 异步调用的BuildUp() 143
6.3 为Builder打个标签 146
6.3.1 完成工具类 146
6.4 具有装配/卸裁能力的Builder 150
6.5 看着图纸加工—登记配置文件 152
6.5.1 把UML的对象变成XSD 152
6.5.2 把握梗概—删除不经常变化的内容 154
6.5.3 映射为配置节点或配置元素 155
6.5.4 实现实体对象 155
6.5.5 完成流水线生产 158
6.6 用迭代器控制流水线 159
6.7 小结 161
第7章 原型模式 163
7.1 经典回顾 164
7.2 表面模仿还是深入模仿 168
7.2.1 概念 168
7.2.2 制作实现克隆的工具类型 169
7.2.3 克隆也要稍微保留点个性 171
7.2.4 定制并管理的克隆过程 172
7.3 重新定义原型方法 173
7.4 同时支持XML和二进制序列化的泛型集合类型处理 174
7.5 小结 179
第3篇 结构型模式—针对组织灵活的对象体系 181
第8章 适配器模式 183
8.1 说明 184
8.2 经典回顾 185
8.3 进—步扩展适配范围的组适配器 187
8.4 Adapter—Adapter互联模式 190
8.4.1 分析 190
8.4.2 方式1:客户程序直接调度Adapter 192
8.4.3 方式2:基于标准约定调度Adapter 192
8.4.4 方式3:借助反射和约定完成异步调用 193
8.5 用配置约定适配过程 194
8.6 XML数据的专用适配机制 196
8.7 小结 198
第9章 桥模式 199
9.1 说明 200
9.2 经典回顾 201
9.3 将复杂性进一步分解后的多级桥关系 204
9.4 看着“图纸”造桥 207
9.5 具有约束关系的桥 209
9.6 小结 211
第10 章组合模式 213
10.1 说明 214
10.2 经典回顾 215
10.3 用迭代器遍历组合类型 218
10.4 适于XML信息的组合模式 220
10.5 小结 223
第11章 装饰模式 225
11.1 说明 226
11.2 经典回顾 226
11.3 具有自我更新特征的装饰模式 230
11.3.1 分析 230
11.3.2 抽象装饰接口 231
11.3.3 抽象状态接口 232
11.3.4 依据当前状态修改装饰 233
11.3.5 测试验证 233
11.4 设计Decorator与Builder协作的产物 234
11.5 把Decorator做成标签 236
11.5.1 更“彻底”的Attribute注入 236
11.5.2 方式1:采用.NET平台自带的AOP机制实现 237
11.5.3 方式2:自定义代理拦截框架方式 239
11.5.4 进—步分析 242
11.6 小结 243
第12章 外观模式 245
12.1 说明 246
12.2 经典回顾 246
12.3 Facade接口 249
12.4 Remote Facade 250
12.5 面向性能考虑的升级版Remote Facade—Data Transfer Object模式 253
12.6 平台、开发语言无关的抽象Facade接口—WSDL 256
12.7 让使用者更加方便的Fluent Interface设计 257
12.8 小结 258
第13章 享元模式 259
13.1 说明 260
13.2 经典回顾 261
13.3 制订共享计划 263
13.4 综合性的共享体系—Object Pool 264
13.4.1 应用背景 264
13.4.2 总体技术结构 264
13.4.3 抽象类型实体设计 265
13.4.4 享元模式的典型应用—缓冲 266
13.4.5 示例 266
13.5 用于并行处理的线程级享元 269
13.6 通过Delegate和队列实现异步Flyweight 270
13.7 小结 271
第14章 代理模式 273
14.1 说明 274
14.2 经典回顾 274
14.3 远程访问代理 276
14.3.1 第1步:定义远程访问的服务协议 277
14.3.2 第2步:定义服务端的配置文件及相应的宿主程序 277
14.3.3 第3步:生成客户端远程代理(Proxy)类型 278
14.3.4 第4步:编写客户端程序 279
14.4 数据访问代理 279
14.5 对象缓存代理 282
14.6 为代理过程增加预处理和后续处理的支持 284
14.6.1 第1步:定义外部处理机制的抽象结构 285
14.6.2 第2步:定义新增处理的配置信息 286
14.6.3 第3步:定义配置解析对象 286
14.6.4 第4步:修正服务端和代理类的处理过程 287
14.7 小结 288
第4篇 行为型模式—算法、控制流和通信关系的对象化处理 289
第15章 职责链模式 291
15.1 说明 292
15.2 经典回顾 292
15.3 用断点控制链式过程 295
15.4 链式反应 298
15.5 增加配置约束 300
15.6 小结 303
第16章 模板方法模式 305
16.1 说明 306
16.2 经典回顾 306
16.3 满足多套模板要求 308
16.4 方法的模板—Delegate 311
16.5 类型的模板—Genec 312
16.6 用配置勾勒的模板 313
16.7 小结 314
第17章 解释器模式 315
17.1 说明 316
17.2 经典回顾 317
17.3 采用正则表达式 320
17.4 采用字典 324
17.5 采用XSD 328
17.6 用XSD解释定制的业务语言 329
17.7 小结 330
第18章 命令模式 331
18.1 说明 332
18.2 经典回顾 333
18.3 轻量级的Command—委托 336
18.4 异步Command 337
18.5 把Command打包 341
18.5.1 外观模式方式 342
18.5.2 组合模式方式 343
18.6 把Command排队 345
18.7 小结 347
第19章 迭代器模式 349
19.1 说明 350
19.2 经典回顾 351
19.3 C#化的Iterator 353
19.4 小结 354
第20章 中介者模式 355
20.1 说明 356
20.2 经典回顾 358
20.3 基于Delegate和事件的松耦合Mediator 362
20.4 根据配置动态协调通知关系 365
20.5 SOAP Mediator 366
20.6 小结 367
第21章 备忘录模式 369
21.1 说明 370
21.2 经典回顾 371
21.3 把备忘压栈 376
21.4 Memento 的序列化和持久化 378
21.5 小结 381
第22章 观察者模式 383
22.1 说明 384
22.2 经典回顾 386
22.3 .NET 内置的 Observer机制—事件 391
22.4 具有Observer的集合类型 392
22.5 面向服务接口的 Observer 394
22.6 小结 397
第23章 状态模式 399
23.1 说明 400
23.2 经典回顾 401
23.3 State的序列化和持久化 405
23.4 主动方式State 407
23.5 触发式State 408
23.6 涉及用户交互的状态流转 410
23.7 用WF完成更易于编排的State 410
23.8 小结 412
第24章 策略模式 413
24.1 说明 414
24.2 经典回顾 415
24.3 Strategy与Interpreter协作 417
24.4 充分利用.NET Framework自带的Strategy接口 418
24.5 动态策略 421
24.6 小结 422
第25章 访问者模式 423
25.1 说明 424
25.2 经典回顾 424
25.3 借助反射实现Visitor 428
25.4 用委托使引用关系更加松散 430
25.5 小结 430
第5篇 小颗粒度基础模式和应用案例—服务于细节的基础性模式 431
第26章 成例 433
26.1 说明 434
26.2 PartialClass 434
26.2.1 体现组合关系 434
26.2.2 从多个侧面刻画类型 435
26.2.3 与Visual Studio Add-ins的结合 436
26.2.4 小结 437
26.3 Gateway 437
26.3.1 封装本地API的Gateway 438
26.3.2 封装非C#语言访问接口 440
26.3.3 封装通用操作方法 440
26.3.4 小结 443
26.4 Mapper 443
26.4.1 介绍 443
26.4.2 数据对象映射器 445
26.4.3 小结 450
26.5 Regist 451
26.6 ValueObject 455
26.7 通用数据载体DataSet和DataTable 457
26.8 Context 458
第27章 GOF总结及应用案例 461
27.1 GOF总结 462
27.1.1 回顾GOF 462
27.2 应用案例需求说明 462
27.3 发现和分析 463
27.4 模式应用 466
27.4.1 已经采用的模式 466
27.4.2 如何实现与具体数据源无关 466
27.4.3 提供执行前后定制处理的能力 476
27.4.4 设计一个结构更加灵活的连接串配置访问机制 477
27.5 小结 482
第6篇 部分架构模式—面向应用全局的模式化处理 483
第28章 MVC模式 485
28.1 说明 486
28.2 模式介绍 487
28.3 示例 489
28.3.1 混合方式 489
28.3.2 分解对象职责 490
28.3.3 主动方式M/V/C 492
28.4 小结 495
第29章 管道—过滤器模式 497
29.1 说明 498
29.2 登机的管道流程 499
29.2.1 数据源发起的推方式 500
29.2.2 数据接收方发起的拉方式 501
29.2.3 中介对象发起的推拉混合方式 502
29.2.4 数据源/数据接收方分别发起的衔接方式 503
29.3 示例 504
29.3.1 推方式示例 504
29.3.2 增加主动方式的Filter 508
29.4 小结 509
第30章 出版—预订模式 511
30.1 说明 512
30.2 生活中无处不在的“预订” 512
30.2.1 面向单一主题的本地观察者模式 512
30.2.2 增加Proxy实现面向单一主题的分布式观察者模式 513
30.2.3 用出版者集中管理预订 514
30.2.4 面向物理环境设计更多出版预订模式 517
30.3 示例 518
30.3.1 数据实体模型部分 518
30.3.2 业务实体模型部分 521
30.3.3 具体实体对象部分 523
30.3.4 单元测试 527
30.4 小结 528
第31章 Broker模式 531
31.1 说明 532
31.2 越来越庞杂的分布式系统交互之感 533
31.3 示例 536
31.4 小结 539
第32章 消息总线模式 541
32.1 说明 542
32.2 用总线梳理企业系统环境 544
32.2.1 分隔区域条件下的消息总线 547
32.3 小结 547
第7篇 部分Web和WebService模式—面向服务开发中的模式化处理 549
第33章 页面控制器模式 551
33.1 说明 552
33.2 用对象化思维抽象和扩展页面操作逻辑 553
33.3 示例 554
33.4 小结 555
第34章 实现Web服务依赖倒置 557
34.1 Web Service的模式化特征 558
34.2 第一层的包装 559
34.2.1 Aggregation 560
34.2.2 Contain 561
34.3 SOA环境下典型的WebService开发方式 561
34.4 依赖倒置原则及其在WebService中的应用 562
34.4.1 分析 564
34.4.2 实现示例 565
34.5 基于WCF的工程化实现 571
34.5.1 实现示例 571
34.5.2 借助WCF扩展服务的对象化特征 574
34.6 小结 576
第35章 Web服务适配器模式 577
35.1 说明 578
35.2 WebService下的接口适配问题 578
35.2.1 常规情景分析 578
35.2.2 WebService间连续交互适配 579
35.2.3 实施方式 580
35.3 采用标准Web Service类型的示例 581
35.3.1 单纯数据XSD适配 581
35.3.2 服务方法兼容性适配 586
35.3.3 其他说明 588
35.4 采用WCF的示例 588
35.4.1 用DataContract定义数据Schema 589
35.4.2 定义不同的类型转换方式示例 590
35.5 小结 592
第36章 Web服务数据传输对象模式 593
36.1 说明 594
36.2 Web Service接口批量交互中的性能问题 595
36.2.1 DTO对象 595
36.2.2 DTO与消费者服务的对应关系 595
36.2.3 部署设计考虑 597
36.2.4 结构 597
36.3 示例 598
36.3.1 没有DTO对象的情况 599
36.3.2 增加DTO对象的情况 601
36.4 小结 602
36.5 附件 603
36.5.1 实现DTO数据装载的两种方式 603
第37章 Web服务事件监控器模式 605
37.1 说明 606
37.2 如何为普通WebService封装事件机制 607
37.3 示例 609
37.4 小结 613
第38章 Web服务拦截过滤器模式 615
38.1 说明 616
38.2 通过拦截完成自定义特性的透明扩展 617
38.2.1 实现方式 617
38.2.2 .NET平台的实现技术 620
38.3 示例 621
38.3.1 基于ASP.NETWebService的IHttpModule方式 621
38.3.2 基于WCF自定义拦截方式 623
38.4 小结 626
附录A 面向关系数据和XML数据的领域逻辑模式 627
A.1 说明 628
A.2 实现业务领域逻辑的主要方法 628
A.2.1 整体逻辑结构 628
A.2.2 性能改进 629
A.2.3 面向关系数据库的业务服务设计 630
A.2.4 面向XML数据的扩展设计 630
A.2.5 配置机制设计 631
A.3 示例 632
A.3.1 示例情景 632
A.3.2 测试内容准备 633
A.3.3 实际测试过程 634
A.4 小结 635
附录B 基于XML的应用建模 637
B.1 说明 638
B.2 世界是平的,但更是多元的 638
B.2.1 更具扩展性的数据模型—XML 638
B.2.2 让非结构化数据可以被识别 642
B.2.3 应对数据和内容的集成 644
B.2.4 新的应用扩展 647
B.2.5 应对语义网络的复杂性 649
B.3 小结 650
索引 651