图书前言

II

大话设计模式 | 【Java溢彩加强版】

本书起因

写这本书源于我的一次做培训的经历,培训对象大多是计算机专业的学生或有一定

经验的在职开发者。他们都知道类、方法、构造方法,甚至抽象类、接口等概念,并用

Visual Studio写过桌面或Web程序。可是,当我提问为什么要面向对象,它的好处在哪里

时,却没有人能完整地讲出来,多数人的反应是,概念是知道的,就是表达不清楚。

针对于此,我举了中国古代四大发明中活字印刷的例子(见第1章),通过一个虚构

的曹操做诗的情景,把面向对象的几大好处讲解了一下,学生普遍感觉这样的教学比直

接告诉他们面向对象有什么好处要更加容易理解和记忆。

这就使得我不断地思考“学一门技术是否需要趣味性以及通俗性的引导”这样一个

问题。

我在思考中发现,看小说时,一般情况下我都可以完整地读完它,而阅读技术方面

的图书,却很少按部就班、每章每页地仔细阅读。尽管这两者有很大区别,技术书中可

能有不少知识是已经学会或暂时用不上的内容,但也不得不承认,小说之所以可以坚持

读完是因为我对它感兴趣,作者的精妙文笔布局在吸引我。而有些技术书的枯燥乏味使

得读者阅读很难坚持,很多时候读几章就将其放入书架了。

技术的教学同样如此,除非学生是抱着明确的学习动机来参与其中,否则照本宣科

的教学、枯燥乏味的讲解,学生一定会被庞杂的概念和复杂的逻辑搅晕了头脑,致使效

果大打折扣。也正因如此,造成部分学生学了四年的计算机编程,却可能连面向对象有

什么好处都还说不清。

为什么不可以让技术书带点趣味性呢?哪怕这些趣味性与所讲的技术并不十分贴

切,只要不是影响技术核心的本质,不产生重大的错误,让读者能轻松阅读它,并且有

了一定的了解和感悟,这要比一本写得高深无比却被长期束之高阁的书好得多。

也正是这个原因,本人开始了关于设计模式的趣味性写作的尝试。

本书读者

显然,本书不是给零编程经验的人看的,对于想入这一行的朋友来说,找一门编程

语言,从头开始或许才是正道。而本书也不太适合有多年面向对象开发经验、对常用设

计模式了如指掌的人—毕竟这里更多的是讲解基本观念。

前 言

III

前 言

我时常拿程序员的成长与足球运动员的成长作对比。

GoF的《设计模式》好比是世界顶级足球射门集锦,而《重构》《敏捷软件开发》

《设计模式解析》好比是一场场精彩的足球比赛。虽然我为之疯狂,为之着迷,可是我

并不只是想做一个球迷(软件使用者),而是更希望自己能成为一个球员(软件设计

师),能够亲自上场比赛,并且最终成为球星(软件架构师)。我仔细地阅读这些被誉

为经典的著作,认真实践其中的代码,但是我总是半途而废、坚持不下去,我痛恨自己

意志力的薄弱、憎恶自己轻易地放弃,难道我真的就是那么笨?

痛定思痛,我终于发现,贝利、马拉多纳不管老、胖都是用来敬仰的,贝克汉姆、

罗纳尔迪尼奥不管美、丑都是用来欣赏的,但他们的球技……客气地说,是不容易学会

的,客观地说,是不可能学得会的。为什么会这样?原来,我学习中缺了一个很重要的

环节,我们在看到了精彩的球赛、欣赏球星高超球技的同时,却忽略了球星的成长过

程。他们尽管有一定天分,但也是从最底层通过努力一点一点慢慢地显露出来的,我们

需要的不仅是世界杯上的那定乾坤的一脚,更需要了解这一脚之前是如何练出那种神奇

脚法的方法。对于程序员来讲,精彩代码的实现思路,要比看到精彩的代码更加令人

期待。

本书显然不是培养球星(软件架构师)的豪门俱乐部,而是训练足球基本功的体

校,培训的是初学足球的小球员(面向对象的程序员),本书希望的是读者阅读后可以

打好面向对象编程的基础,从而更加容易并深入地理解和感受GoF的《设计模式》以及其

他大师作品的魅力。

本书定位

本书是在学习众多大师智慧结晶的图书作品、分享了多位朋友的实践经验的基础

上,加之自己的编程感受写出来的。正如牛顿有句名言:“如果说我比别人看得更远

些,那是因为我站在了巨人的肩上。”

显然本书并没有创造或发现什么模式,因此谈不上站在巨人肩膀上而看得更远。

所以作者更希望本书能成为一些准备攀登面向对象编程高峰的朋友的登山引路人、提携

者,在您登山途中迷路时给予指引一条可以坚实踩踏的路线,在您峭壁攀岩不慎跌落时

给予保护和鼓励。

本书特色

本书有两个特色。

第一个特色是重视过程。我看了太多的计算机编程类的图书,大多数书籍都是在

集中讲授优秀的解决方案或者完美的程序样例,但对这些解决方案和程序的演变过程却

重视不够,好书之所以好,就是因为作者可以站在学习者的角度去讲解问题所在,让学

大话设计模式 | 【Java溢彩加强版】

习门槛降低。《重构与模式》中有一句经典之语:“如果想成为一名更优秀的软件设计

师,了解优秀软件设计的演变过程比学习优秀设计本身更有价值,因为设计的演变过程

中蕴藏着大智慧。”本人就希望能通过小菜与大鸟的对话,在不断地提问与回答过程

中,在程序的不断重构演变中,把设计模式的学习门槛降低,让初学者可以更加容易地

理解,为什么这样设计才好,你是如何想到这样设计的。

第二个特色就是贴近生活。尽管编程是严谨的,不容大话和戏说,但生活却是多姿

多彩的,而设计模式也不是完全孤立于现实世界而凭空想出来的理论。事实上,所有的

模式都可以在生活中找到对应。因此,通过主人公小菜和大鸟的对话,将求职、面试、

工作、交友、投资、兼职、办公室文化、生活百味等非常接近程序员生活原貌的场景写

到了书中,用一个个小故事来引出模式,会让读者相对轻松地进入学习设计模式的状

态。当然,此举的最大目的还是为了深入浅出,而非纯粹噱头。

本书内容

本书通篇都是以情景对话的形式,用一个又一个的小故事或编程示例来组织的。全

书共分为四个部分。

 ●开篇是楔子,主要向不熟悉面向对象编程的读者给出一个观念说明,并通过一

个例子的演变介绍类、封装、继承、多态、接口等概念。 

●第二部分(第4~5章,第11章)是面向对象的意义和好处以及几个重要的设计原

则—通过小菜面试的失败引出。 

●第三部分(第1~3章、第6~10章、第12~28章)是详细讲解23个设计模式。 

●第四部分(第29章)是对设计模式的总结,利用小菜梦到的超级模式大赛的场

景,把所有的面向对象和模式概念都拟人化来趣味性地总结设计模式之间的异

同和关键点。

本书人物及背景

小菜:原名蔡遥,22岁,上海人,上海某大学计算机专业四年级学生,成绩一般,

考研刚结束,即将毕业,正求职找工作,梦想进大厂。

大鸟:原名李大辽,29岁,小菜的表哥,云南昆明人,毕业后长期从事软件开发和

管理工作,近期到上海发展,借住小菜家在宝山的空房内。

小菜以向大鸟学习为由,也从市区父母家搬到宝山与大鸟同住。

本书研读方法

本书建议按顺序阅读,如果您感觉由于面向对象知识的匮乏(例如对继承、多态、

前 言

接口、抽象类的理解不足)造成阅读上的困难,不妨先阅读楔子的“培训实习生—面

向对象基础”部分,然后再从第1章开始阅读。如果您已经对不少设计模式很熟悉,也不

妨挑选不熟悉的模式章节阅读。

本书中的很多精华都来自许多大师作品,建议读者通过笔记形式记录,这将有助于

您的记忆和理解设计模式,增强最终的读书效果。

本书中出现的“[ ]”表示句子摘自某书。例如,“策略模式(Strategy):它定义了

算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响使

用算法的客户[DP]。”其中“[DP]”表示此句摘自《设计模式:可复用面向对象软件的基

础》,详细摘要说明请参看参考文献。

本书第29章中的虚拟人物姓名都是软件编程中的专业术语,因此凡是专业术语被影

射人物姓名的都用紫色字表示,以和实际术语区分。例如,“第一位是我们OOTV创始

人,面向对象先生”,这里的紫色字面向对象指人名。

关于本书学习的疑问解答

 ●看本书需要什么基础?

主要是Java或其他编程语言的基础知识,如变量、分支判断、循环、函数等编程基

础,关于面向对象基础可参看本书的楔子(第0章)。

 ●设计模式是否有必要全部学一遍?

答案是,Yes!别被那些说什么设计模式大多用不上,根本不用全学的舆论所左右。

尽管现在的设计模式远远不止23种,但对所有的都有研究是不太容易的,就像作者本人

一样,在学习GoF总结的23个设计模式过程中,你会被那些编程大师们进行伟大的技术思

想洗礼,不断增加自己对面向对象的深入理解,从而更好地把这种思想发扬光大。这就

如同高中时学立体几何感觉没用,但当你装修好房子购买家具时才知道,有空间感,懂

得空间计算是如何重要,你完全可能遇到买了一个大号的冰箱却放不进厨房,或买了开

关门的衣橱(移门不占空间)却因床在旁边堵住了门而打不开的尴尬。

重要的不是你将来会不会用到这些模式,而是通过这些模式让你找到“封装变

化”“对象间松散耦合”“针对接口编程”的感觉,从而设计出易维护、易扩展、易复

用、灵活性好的程序。成为诗人后可能不需要刻意地按照某种模式去创作,但成为诗人

前他们一定是认真地研究过成百上千的唐诗宋词、古今名句。

如果说,数学是思维的体操,那设计模式,就是面向对象编程思维的体操。

 ●我学了设计模式后时常会过度设计,如何办?

作者建议,暂时现象,继续努力。

设计模式有四境界:

..没学前一点不懂,根本想不到用设计模式,设计的代码很糟糕。

..学了几个模式后,很开心,于是到处想着要用自己学过的模式,于是时常造成

大话设计模式 | 【Java溢彩加强版】

误用模式而不自知。

..学完全部模式时,感觉诸多模式极其相似,无法分清模式之间的差异,有困

惑,但深知误用之害,应用之时有所犹豫。

..灵活应用模式,甚至不应用具体的某种模式也能设计出非常优秀的代码,以达

到无剑胜有剑的境界。

从作者本人的观点来说,不会用设计模式的人要远远超过过度使用设计模式的人,

从这个角度讲,因为怕过度设计而不用设计模式显然是因噎废食。当你认识到自己有过

度使用模式的时候,那就证明你已意识到问题的存在,只有通过不断的钻研和努力,你

才能突破“不识庐山真面目,只缘身在此山中”的瓶颈,达到“会当凌绝顶,一览众山

小”的境界。

编程语言的差异

本书讲的是面向对象设计模式,是用Java语言编写,但本书并不是主要讲解Java语言

的图书,因此本书同样适合C#、VB.NET、C++等其他一些面向对象语言的读者阅读来学

习设计模式。

就C#而言,主要差异来自C#对于子类继承父类或实现接口用的都是“:”,而Java

中两者是有区别的。

当Cat继承抽象类Animal时,C#语法是:

public class Cat : Animal

当Superman实现接口IFly时,C#语法是:

public class Superman : IFly

然后C#类中的方法,如果父类是虚方法,需要子类指定new或是override修饰符。还

有一些其他差异,但基本都不影响本书的阅读。

C++的程序员,可能在语言上会有些差异,不过本书应该不会因为语言造成对面向

对象思想的误读。

本书代码下载

前 言

尽管本书中的代码都提供下载,但不经过读者的自己手动输入过程,其实阅读的

效果是大打折扣的。强烈建议读者根据样例自己写程序,只有在运行出错,达不到预期

效果时再查看本书提供的源程序,这样或许才是最好的学习方法。有问题可及时与我联

系。博客是http://cj723.cnblogs.com/。

本书课件下载

读者群

读者在学习过程中遇到的问题,可以加入本书QQ群讨论。另外,本书虽然经历了十

几年的迭代锤炼,依然可能存在错误。读者群会随时更新勘误文档。

QQ群:638992788

不是一个人在战斗

首先要感谢我的妻子李秀芳对我写作本书期间的全力支持,没有她的理解和鼓励,

就不可能有本书的出版。

父母的养育才有作者本人的今天,本书的出版,寻根溯源,也是父母用心教育的结

果。养育之恩,没齿难忘。

本书起源于本人在“博客园”网站的博客http://cj723.cnblogs.com/中的一个连载文章

《小菜编程成长记》。没想到连载引起了不小的反响,网友普遍认为本人的这种技术写

作方式新颖、有趣、喜欢看。正是因为众多网友的支持,本人有了要把GoF的23种设计模

式全部故事化的冲动。非常感谢这些在博客回复中鼓励我的朋友。

这里需要特别提及洪立人先生,他是本人在写书期间共同为理想奋斗的战友,写作

也得到了他的大力支持和帮助。在此对他表示衷心的感谢。

写作过程中,本人参考了许多国内外大师的设计模式的著作。尤其是《设计模式》

(作者:简称GoF的Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides)、《设

计模式解析》(作者:Alan Shalloway,James R. Trott)、《敏捷软件开发:原则、模式

大话设计模式 | 【Java溢彩加强版】

与实践》(作者:Robert C.Martin)、《重构—改善既有代码的设计》(作者:Martin 

Fowler)、《重构与模式》(作者:Joshua Kerievsky)、《Java与模式》(作者:阎

宏),等等,没有他们的贡献,就没有本书的出版。也希望本书能成为更好阅读他们这

些大师作品的前期读物。

写作过程中,本人还参考了http://www.dofactory.com/关于23个设计模式的讲解,并

引用了他们的结构图和基本代码。在博客园中的许多朋友,如张逸、吕震宇、李会军、

idior、Allen Lee的博文,MSDN SmartCast中李建忠的讲座,CSDN博客中的大卫、ai92的

博文,网站J道www.jdon.com的版主banq的文章都给本人的写作提供了非常大的指引和帮

助,在此表示感谢。另外,博客园的双鱼座先生还对本人的部分代码提出了整改意见,

也表示衷心的谢意。详细参考资料与网站链接见参考文献。

事实上,由于本人长期有看书记读书笔记的习惯,所以书中引用笔记的内容,也极

有可能是来自某本书或者某个朋友的博客、某个网站的文章。而本人已经无法一一说出

其引用的地址,但这些作者的智慧同样对本书的写作带来了帮助,在此只能说声谢谢。

最后,对清华大学出版社表示由衷的感谢。

程 杰

2022年9月