本书是第一部关于C#和.NET设计模式的权威指导著作,为基于C#语言和Microsoft ? .NET框架的开发人员学习设计模式和应用设计模式提供了一个完整全面的理论框架和大量的详细应用实例。本书内容覆盖了所有23个经典的“四人小组”设计模式,具体包括:适配器,外观,合成,桥接,单件,观察者,中介者,代理,职责链,享元,生成器,工厂方法,抽象工厂,原型,备忘录,模板方法,状态,策略,命令,解释器,装饰,迭代器,以及访问者等模式。本书提供了大量的C#代码,解释说明了在.NET框架下如何应用上述设计模式。读者在阅读本书之后,将会对关于C#语言和Microsoft .NET框架的设计模式的整体概念、基本原理、内部实现有一个清晰的认识,并可以将设计模式应用于基于C#语言和.NET框架的面向对象软件开发实践当中。本书还提供了丰富的附录资源,有兴趣的读者可以通过利用这些资源进一步增强对设计模式的理解。
STEVEN JOHN METSKER在设计横式、面向对象程序设计及软件设计方法学等领域有广泛的著述。Steven是Cap Tech风险投资公司的一位软件业务咨询人员,经常在OOPSLA会议上发言。他的著作发表在《Java Report》、《JOOP》、《Distributed Oblect ComputingL》、《Object Magazine》等杂志上。Steven在Addison-Wesley公司出版的著作包括:《Design Patterns Java Workbook》(影印版《设计模式Java手册》已由中国电力出版杜出版)和《Building Parsers in Java》。
..
<< 查看详细
译者序
前 言
第1章 引言 1
1.1 为什么使用模式? 1
1.2 为什么使用设计模式? 2
1.3 为什么使用C#语言? 2
1.4 UML 3
1.5 本书给出的问题 3
1.6 本书的组织方式 4
1.7 欢迎来到Oozinoz公司! 5
1.8 小结 5
第1部分 接口型模式
第2章 接口型模式介绍 9
2.1 接口与抽象类 9
2.2 接口与委托 10
2.3 接口与属性 13
2.4 接口的细节 14
2.5 小结 14
2.6 普通接口无法提供的内容 15
第3章 适配器模式 16
.3.1 对接口进行适配 16
3.2 类适配器与对象适配器 19
3.3 对.NET的数据进行适配 22
3.4 小结 25
第4章 外观模式 27
4.1 一个普通的外观 27
4.2 应用外观模式进行代码重构 29
4.3 外观、公用例程以及演示 36
4.4 小结 38
第5章 合成模式 39
5.1 一个普通的合成 39
5.2 合成的递归行为 39
5.3 合成、树形结构,以及环形结构 41
5.4 带环形结构的合成 45
5.5 环形结构产生的影响 48
5.6 小结 48
第6章 桥接模式 49
6.1 一个普通的抽象 49
6.2 从抽象到桥接 51
6.3 作为桥接的驱动器 53
6.4 数据库驱动器 53
6.5 小结 53
第2部分 职责型模式
第7章 职责型模式介绍 57
7.1 普通的职责 57
7.2 利用可访问性进行职责控制 58
7.3 小结 61
7.4 普通职责无法提供的内容 61
第8章 单件模式 62
8.1 单件模式的机制 62
8.2 单件与线程 63
8.3 识别单件模式 64
8.4 小结 65
第9章 观察者模式 66
9.1 C#语言对观察者的支持 66
9.2 委托机制 66
9.3 一个经典的例子——GUI中的观察者模式 69
9.4 模型/视图/控制器 75
9.5 分层 77
9.6 小结 80
第10章 中介者模式 81
10.1 一个经典实例——GUI中介者 81
10.2 关系完整性中介者 84
10.3 小结 90
第11章 代理模式 91
11.1 一个简单的代理 91
11.2 数据代理 94
11.3 远程代理 99
11.4 小结 103
第12章 职责链模式 104
12.1 一个普通的职责链模式 104
12.2 重构为职责链模式 105
12.3 将一个链进行固定 108
12.4 不带合成结构的职责链模式 109
12.5 小结 109
第13章 享元模式 111
13.1 不可改变性 111
13.2 提取一个享元中的不可改变部分 112
13.3 共享享元 113
13.4 小结 116
第3部分 构造型模式
第14章 构造型模式介绍 119
14.1 对象构造过程中产生的一些困难 119
14.2 小结 121
14.3 普通的构造方法无法提供的内容 121
第15章 生成器模式 123
15.1 一个普通的生成器模式 123
15.2 在约束下进行对象生成 125
15.3 一个更宽容的生成器 127
15.4 小结 128
第16章 工厂方法模式 129
16.1 一个经典实例——枚举器 129
16.2 识别工厂方法模式 131
16.3 确定对哪个类进行实例化 131
16.4 平行层次结构中的工厂方法模式 132
16.5 小结 134
第17章 抽象工厂模式 135
17.1 一个经典实例——GUI工具箱 135
17.2 抽象工厂与工厂方法 139
17.3 命名空间与抽象工厂 142
17.4 小结 142
第18章 原型模式 143
18.1 作为工厂的原型 143
18.2 利用克隆进行原型化 144
18.3 小结 145
第19章 备忘录模式 147
19.1 一个经典实例——使用备忘录完
成取消操作 147
19.2 备忘录的持久性 153
19.3 跨越多次会话的永久备忘录 153
19.4 小结 155
第4部分 操作型模式
第20章 操作型模式介绍 159
20.1 操作与方法 159
20.2 特征标记 160
20.3 委托 161
20.4 异常 162
20.5 算法与多态 162
20.6 小结 163
20.7 普通操作无法提供的内容 164
第21章 模板方法模式 165
21.1 一个经典实例——排序 165
21.2 完成一个算法 167
21.3 模板方法的钩子 169
21.4 重构为模板方法 171
21.5 小结 172
第22章 状态模式 173
22.1 对状态进行建模 173
22.2 重构为状态模式 176
22.3 使状态成为常量 180
22.4 小结 181
第23章 策略模式 183
23.1 对策略进行建模 183
23.2 重构为策略模式 185
23.3 对策略模式和状态模式进行比较 189
23.4 对策略模式和模板方法模式进行比较 190
23.5 小结 190
第24章 命令模式 191
24.1 一个经典实例——菜单命令 191
24.2 利用命令模式提供一个服务 192
24.3 命令模式的钩子 195
24.4 命令模式与其他模式的关系 196
24.5 小结 197
第25章 解释器模式 199
25.1 一个解释器实例 199
25.2 解释器、语言以及扫描分析器 210
25.3 小结 210
第5部分 扩展型模式
第26章 扩展型模式介绍 213
26.1 面向对象设计的基本原则 213
26.2 Liskov替代原则 213
26.3 Demeter法则 215
26.4 消除代码的气味 216
26.5 普通扩展无法提供的内容 216
26.6 小结 217
第27章 装饰模式 219
27.1 一个经典例子——流 219
27.2 函数包装器 226
27.3 GUI中的装饰器 232
27.4 装饰模式与其他模式的关系 232
27.5 小结 232
第28章 迭代器模式 234
28.1 一般的迭代 234
28.2 线程安全的迭代 234
28.3 对一个合成进行迭代 239
28.4 小结 248
第29章 访问者模式 249
29.1 访问者机制 249
29.2 一个普通的访问者模式 250
29.3 访问者环 255
29.4 对访问者模式的争论 259
29.5 小结 260
附录A 使用指导 261
A.1 从本书获得更多的知识 261
A.2 理解经典实例 261
A.3 在代码中应用设计模式 262
A.4 坚持学习 262
附录B 答案 264
B.1 接口型模式介绍 264
B.2 适配器模式 266
B.3 外观模式 269
B.4 合成模式 271
B.5 桥接模式 273
B.6 职责型模式介绍 275
B.7 单件模式 277
B.8 观察者模式 278
B.9 中介者模式 280
B.10 代理模式 284
B.11 职责链模式 285
B.12 享元模式 288
B.13 构造型模式介绍 291
B.14 生成器模式 293
B.15 工厂方法模式 295
B.16 抽象工厂模式 299
B.17 原型模式 302
B.18 备忘录模式 304
B.19 操作型模式介绍 306
B.20 模板方法模式 307
B.21 状态模式 309
B.22 策略模式 310
B.23 命令模式 312
B.24 解释器模式 314
B.25 扩展型模式介绍 316
B.26 装饰模式 317
B.27 迭代器模式 319
B.28 访问者模式 321
附录C OOZINOZ系统的源代码 323
C.1 获取代码与使用代码 323
C.2 构建Oozinoz系统的代码 323
C.3 帮助Oozinoz代码查找相关文件 324
C.4 利用NUnit对代码进行测试 324
C.5 如何查找相关文件 325
C.6 小结 325
附录D UML概览 326
D.1 类 326
D.2 类关系 327
D.3 接口 328
D.4 委托与事件 329
D.5 对象 330
D.6 状态 331
术语表 332
参考文献 338
设计模式描述了在面向对象软件设计过程中针对特定问题的解决方案。本书描述了这些解决方案,并用简洁而优雅的方式表达出来,有助于开发人员利用整个软件开发群体的智慧开发健壮的高质量软件。设计模式在构造复杂系统的过程中的重要性已经得到了广泛的认可,它也反映了软件开发者为了设计出灵活而又可重用的软件所付出的长期的艰苦努力。
本书的作者是Steve John Metsker,他在设计模式、面向对象程序设计,以及软件设计方法学等领域有广泛的著述。Steve是CapTech风险投资公司的一位软件业务咨询人员,本书是他在Addison- Wesley公司出版的第三部著作,同时也是第一部完整的面向C#和.NET程序员的设计模式指导著作。
本书内容覆盖了所有23个著名的经典“四人小组”设计模式,为基于C#语言和.NET框架的软件开发人员学习设计模式和应用设计模式提供了一个完整全面的理论框架和大量详细的应用实例。本书提供了大量详细的C#代码,基于程序代码,解释说明了在.NET框架下如何应用上述设计模式。一方面,本书详细阐述了如何利用设计模式来创建简洁而优雅的C#代码,另一方面,本书还强调了如何在应用设计模式的同时,还能够有效地利用Microsoft .NET框架类库的丰富内容。本书提供了大量的例子和问题,从而有助于读者学习和掌握相关技巧。
本书的一个特点是强调了每种设计模式的应用上下文。在详细阐述各种设计模式的目的、工作原理、实现方案的同时,本书特别关注了各种模式的应用场合,并利用实例解释了各种模式在不同应用条件下可能存在的缺点和不足。本书的另一个特点是广泛使用了.NET框架类库,从而使读者在应用各种设计模式时,能够利用.NET框架类库提供的强大功能。
读者在阅读本书之后,对关于C#语言和.NET框架的设计模式的整体概念、基本原理、内部实现将会有一个清晰的认识,并可以很好地将设计模式应用于基于C#语言和.NET框架的面向对象软件开发实践当中。如果读者对软件设计模式有所了解,那么本书可以加深读者对设计模式的认识,并指导读者在基于C#语言的开发过程中使用设计模式。如果读者还不熟悉设计模式,那么本书也是一本理想的实践入门指导书。
在本书的翻译过程中,我们本着对读者认真负责的精神,力求做到技术内涵的准确无误和专业术语的规范统一,力求做到翻译的准确性和灵活性的有效结合。
本书由颜炯翻译。在本书翻译过程中,我们得到了束尧、李蕾、王凤芹、肖和平、李慧霸、钟鸣、顾剑、于潇等人的大力支持,在此表示感谢。Be Flying翻译小组负责人肖国尊负责本书翻译质量和进度的控制与管理。敬请广大读者提供反馈意见,读者可以将意见用E-mail发至be-flying@ sohu.com,我们会仔细查阅读者发来的每一封邮件,以求进一步提高今后翻译的质量。
译 者
2005年2月22日
很久以前(两年前!),当时还是Addison-Wesley出版社的编辑Paul Becker鼓励我写作本书。我感谢Paul的帮助,并要感谢他的继任者,John Neidhart,他在Paul离任后接任了编辑的职务。我同时还要感谢John Vlissides的鼓励,他是模式丛书的编辑,我所有三部著作的写作工作都得到了他的支持。
John Vlissides也是《Design Patterns》的四位作者之一。他与另外三位作者——Erich Gamma、Ralph Johnson,以及Richard Helm一起,写出了一部有关设计模式的著作,而这部著作包括的内容是每个软件开发人员都应该知道的。同时,他的著作也为我的写作工作确定了写作的质量标准,并且要求我能够透彻地讲解书中相关内容,这也正是我写作本书过程中所渴望达到的。
除了《Design Patterns》一书,我还从其他著作中受益非浅,请参考本书的参考书目。这些著作中,我特别要提到《The Unified Modeling Language User Guide》[Booch],因为它透彻地解释了UML。为了简洁而精确地说明与C#相关的内容,我几乎每天都要参考《C# Essentials》[Albahari]一书。《C# and the .NET Platform》[Troelsen]一书为我提供了大量的指导。另外,为了给出本书的实际例子,我参考了《The Chemistry of Fireworks》[Russell]一书。
在本书开始成形之时,几位优秀的审阅人员帮助指导了本书的写作计划,我希望感谢Bill Wake在我写作早期对本书的审阅,他具有发现那些最细微错误的惊人能力,同时,他对本书写作的整体方向、写作内容,以及写作风格等都提出了建议,这令我十分钦佩。我也要感谢Steve Berczuk和Neil Harrison,他们都提出了一个关键意见,即本书需要为各种模式给出更多的介绍性材料。在听取他们的评价和建议之后,我重写了本书。因此,本书内容显得更加充实。
在编辑和审阅人员的帮助下,我完成了本书的写作工作;然而写出一本书的文字仅仅是个开始。我还要感谢Nick Radhuber和整个出版集体的艰苦工作和贡献,因为,正是由于他们辛勤的工作,才使这些文字得以转化为能够发挥最大作用的形式——书!
Steve Metsker(Steve.Metsker@acm.org)