我为什么写这本书
2002年,微软研究院(Microsoft Research)在英国的剑桥主持了一次国际会议,在这次会议上,微软展示了它的Rotor系统,这个系统将C#和.NET带给了非Windows程序员。会议结束之后,我回到家开始编写相关软件、论文和书,这一过程中我意识到:我们已经见证了一轮真正的程序设计革命的开始。自1996年Java出现以来,程序设计变得平台独立:通过Java的字节码,程序可以到处运行。然而,这种独立性只适用于Java编写的程序。与此不同的是,.NET是独立于语言的:它允许不同语言编写的程序彼此交互,只是在那一天到来之前,这仅限于Windows系统。.
在后面的五年里,出现了新的支持.NET的平台(比如Mono)以及新的支持Intel芯片的硬件(Windows跑在Intel芯片上)。结果就是,如今.NET也几乎可以到处运行了。于是,C#程序设计也成了一门可移植的编程技术。但作为一门语言,C#一直在改进,现在我们处在了向3.0飞跃的起始点上,为带来更高的生产率和更好的易用性,C# 3.0提供了大量有用的新特性。我在2003年写过一本介绍C#语言的书,4年后(2007年)发布的新特性所带来的好处,使我觉得C# 3.0将软件开发推向了一个更高的层次。我曾经想再写一本书,把C# 3.0介绍给那些已经掌握语言基础的开发者,但采用何种的形式才能更好的介绍一种编程语言,同时满足读者在精确性、示例方面的要求以及大量的现实性需求呢?
我想到了设计模式。设计模式封装了综合运用语言特性来解决问题的一般的、公认的和有效的方法。它们提升了讨论的层次,实现并发展了好的编程方法。然而,设计模式总带给人们一些不现实的感觉,人们对设计模式的印象常常是:讨论得多,用得少。我想改变这一点,借助于为他们准备的最好的编程语言:C# 3.0,让普通的开发者也真正理解设计模式。
本书为谁而写
如果你是一个钟爱自己代码的程序员,想让代码的每一行都有准确的含义,每一个特性都用在正确的场合中,这本书就是为你准备的。它将帮助你完成最基本的工作:使你的代码正确、优雅、可扩展而且高效。如果你在公司里的负责代码质量,你也需要一本像《C# 3.0设计模式》这样的书。对于那些致力于成为软件工程师或架构设计师的低层程序开发者,掌握设计模式的知识也是一大进步。
通过阅读本书,你可以掌握以下技能:
*设计模式编程;
*用来描述模式的基本UML建模表示法;
*选择适合于特定情形的模式,并比较不同的实现方式;
*使用C# 3.0的高级语言特性来高效、优雅地实现模式。
尽管本书并没有被写成一本教科书,它完全可以用于设计模式和高级程序设计方面的中级课程。
本书中所有模式及相关示例的图、代码和研究案例都可以从本书的网站下载:http://www.oreilly.com/catalog/9780596527730
阅读本书需要的知识
本书是为这种程序员准备的:至少了解C# 1.0或Java1.4程序设计并希望进一步转到最新版本的语言上,使用更加现代化的特性进行程序开发。C# 3.0的所有新特性,以及许多来自于C# 2.0的较新颖的特性,在本书中都通过示例做了介绍,为方便引用,本书还在注释文字中进行了总结。因此,本书也可以作为语言的使用指南。
本书并不要求读者熟悉设计模式。它已涵盖了全部23种经典模式。这23种模式是Erich Gamma、Richard Helm、Ralph Johnson 和John Vlissides四人于1994年在他们的《Design Patterns: Elements of Reusable Object-Oriented Software》(中文书名《设计模式:可复用面向对象软件的基础》)中提出的,而且现在已成为其它领域(如安全、并发和框架程序设计)中出现的新模式的基础。看完本书,读者将深入掌握设计模式基础,就像大多数人所理解的那样。
本书是如何组织的
第1章是综述,在之后的章节中本书详细介绍了23种核心设计模式。每一章介绍两到三种模式,选择的依据是相似的可用性,这样,在同一章的末尾可以将它们进行比较。所有这些模式被分成3组:结构型模式、创建型模式和行为型模式。
我们从结构型模式开始,第2章学习装饰器(Decorator)模式,代理(Proxy)模式和桥接(Bridge)模式;第3章学习组合(Composite)模式和享元(Flyweight)模式;第4章学习适配器(Adapter)模式和外观(Facade)模式。然后我们转向创建型模式,第5章探讨原型(Prototype)模式、工厂方法(Factory Method)模式和单例(Singleton)模式,第6章探讨抽象工厂(Abstract Factory)模式和生成器(Builder)模式。剩下的4章处理最大的一类:行为型模式:第7章讨论策略(Strategy)模式,状态(State)模式和模板方法(Template Method)模式;第8章讨论职责链(Chain of Responsibility)模式和命令(Command)模式;第9章讨论迭代器(Iterator)模式、中介(Mediator)模式和观察者(Observer)模式;最后第10章讨论访问者(Visitor)模式、解释器(Interpreter)模式和备忘录(Memento)模式。
我们对每种模式的讨论都分成以下几个部分:
.任务
对模式进行简单的上层描述,并指出模式要达到的目的。
案例
从现代计算机系统开发中找出一种可能用到该模式的情形,并通过图片或图表给出一种现实的场景,帮助你记忆这种模式。
设计
确定模式中彼此交互的各个参与者以及它们所扮演的角色,把它们表示成UML图的形式,同时指明它们跟“实例分析”中描述的各参与者之间的联系。
实现
使用“设计”一节中引入的条款,逐步求精地开发一小段程序来示范模式的使用。
示例
也是一段示范模式使用的程序,通常是对实例分析的实现,这一节的程序不再与模式条款保持严格一致。
用途
讨论适合运用模式的现实场景,以一个表格结尾,表格中列出了该模式所适用的条件。
练习
一些难度不等的习题,这些习题都经过细心的设计,可以加深你对模式的理解。
每一章的末尾都会对本章所讨论的模式进行比较,同时也会讨论一下它们可以怎样与先前讨论过的其它模式协作。
模式出现的顺序也作了精心的选择,从而渐进地反应了C# 3.0的成熟过程。在每一章讲解的模式当中,前面的模式实现起来一般很少用到C#1.0以外的特性,而后面的模式实现起来就复杂一些,需利用C# 3.0中提供的更高级的特性。这样的安排可以在用到新特性时直接介绍它,而不是在书的开始或结尾处统一讲解。..
本书并不是一本C#语言的参考书,甚至也不是C# 3.0的参考书,相反,它是一本用上了C#语言大多数有趣特性的实用手册。尽管本书强调用最新版本的语言进行开发,我还是从C#1.0和2.0中挑出了一些我认为有用但平时却不被经常使用的特性。
以下是本书的一些特色:
*图示的模式使你可以专注于理解每种模式在现实开发中的用途;
*与UML图示有关的小测验;
*可被改编以适应于多种情形的干净整洁的“理论”代码;
*指导你在何种情况下选用何种特定模式的表格;
*对相似模式进行比较的表格,显示其不同之处;
*给出每种模式的优点、缺点和局限性的列表;
*帮你深入掌握知识的挑战和练习。
使用本书时还需要什么
要运行本书中的程序,你需要:
*运行Windows XP或Vista的计算机。兼容平台包括任何PC机以及带有虚拟机的基于Intel的Mac系统;
*Microsoft .NET Framework 3.5。在2007年10月份,这一版本尚处于Beta 2阶段,但现在它已非常稳定。你可以从这里获取:http://www.microsoft.com/downloads;
*一个程序编辑器或开发环境。Visual Studio 2008是C# 3.0编程的最佳伴侣,但并非必须;
*C# 3.0参考文档,可以微软网站获取(http://msdn2.microsoft.com/vcsharp, 529页)。
本书中的所有程序都是在一台iMac系统(Intel Core 2 Duo处理器)上开发的,上面运行着Mac OS X 10.4和5(Tiger和Leopard),以及跑在Parallels虚拟机里的Windows XP。
找到你所需要的
本书的目的是成为一种学习资源。在学习C# 3.0和设计模式的过程中,有时你可能想查阅某个特别的特性或某个相关的模式。第11章给出了这样的表格以便于参考。第一章给出了UML类图表示法。为节省空间,你会发现有些程序并没有完整地包含在正文中,但它们都包含在了附录中了。
本书采用的约定
本书采用了如下的字体约定:
斜体(Italic)
用于表示新术语、URL或email地址。
等宽字体(Constant width)
用于表示示例代码、摘录、注释、选项、变量、属性(Attribute)、函数、类型、类、命名空间、方法、属性(Property)、参数、对象、事件和XML标签。
等宽粗体(Constant width bold)
用于强调或突出代码示例。
等宽斜体(Constant width italic)
表示应被用户提供数据来取代的部分。
注意:表示一个提示、建议或一般说明。
警告:表示一个警告或告诫。
使用示例代码
本书的目的是帮助你完成工作。基本上,你可以将书中的代码用于你的程序或文档。无需取得我们的许可,除非你直接复制大量的代码。举例来说,在程序中使用几段书中的代码无需许可。出售或发布含有O’Reilly书中示例的CD-ROM则需经许可。引用本书中的叙述或示例代码来回答问题无需许可。将书中的大量代码合并到你的产品文档中则需经许可。
虽然我们并不要求在引用本书的时候做版权归属声明,但如果你这样做了,我们将非常感激。版权归属声明通常包含标题,作者,发行者和ISBN。例如:“C# 3.0设计模式,Judith Bishop著,版权所有2008 Judith Bishop,978-0-596-52773-0”
如果你觉得你对书中示例代码的使用超出了正常范围,或者不符合以上描述的许可,尽管用电子邮件跟我们联系:permissions@oreilly.com。
问题和评论
本书的作者非常乐意听到你关于本书的想法,以及你是否有新想法来改善C#设计模式的表现方式。关于本书的问题和评论请与出版公司联系:
美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
100035北京市西城区西直门南大街2号成铭大厦C座807室
奥莱利技术咨询(北京)有限公司
我们将提供一个关于本书的主页,在那上面提供勘误表、示例以及其它附加信息。你可以从这里访问到它:
http://www.oreilly.com/catalog/9780596527730(原文书网页)
http://www.oreilly.com.cn/book.php?bn=978-7-111-25080-7(本书中文网页)
关于本书的任何技术问题或评论请发邮件给:
bookquestions@oreilly.com
info@mail.oreilly.com.cn
如果想了解关于我们的图书、会议、资源中心以及O’Reilly Network的更多信息,可以浏览以下站点:
http://www.oreilly.com
http://www.oreilly.com.cn
本书的作者也提供了一个关于本书的站点:
http://patterns.cs.up.ac.za
致谢
首先要感谢我的编辑,O’Reilly的John Osborn,感谢他践约让此书如期出版。更感谢他对本书的关注,并提出了一些专家级的见解。其次要感谢很久以前就签署了此书的Jeff Pepper。我们没能一起完成这个项目,这令人感到遗憾。还要感谢本书的审阅者:Eric Lippert、Jim Whitehead、Stefan Gruner和Pierre-Henri Kuat,他们不留情面、却富有洞察力的意见导致了本书的多次修订,最终成就了一本更好的书。在比勒陀利亚大学,系里为我提供了最新的设备,在我需要时,我的同事们给了我足够的时间,使我能真正做到专心致志。特别的,我要感谢Jan Eloff,感谢他的支持和友好。感谢Carlo Ghezzi在2007年的夏天招待了我,本书初稿的大部分都是那时完成的。还有我的校友Hans Lombard和D-J Miller,他们常常可以随叫随到,并帮我整理了一些书中的例子,他们的许多新鲜思想和对任务的投入令我欣赏。
我那些非常有才华的朋友:Nigel Horspool,Rob Koenig以及Rudolph Vosser,如果没有来自他们的兴趣和支持,写作本书的过程将不会这么愉快。他们一直不知道这本书究竟何时才能完成,但它现在完成了。最后,感谢我的妈妈,我的孩子们和我的家庭,他们的爱,还有跟他们生活在一起的欢乐一直支持着我完成这本书(还有另外一本),谢谢你们。...
——Judith Bishop
2007年10月于南非,比勒陀利亚