首页>参考读物>计算机科学与技术>软件工程及软件方法学

设计模式初学者指南
作者 : Allen Holub
译者 : 徐迎晓
出版日期 : 2006-10-15
ISBN : 7-111-19799-2
定价 : 49.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 380
开本 : 16开
原书名 : Holub On Patterns Learning Design Patterns by Looking at Code
原出版社: Apress
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

“不论你是否同意Holub的各种观点,有一点不可否认,这是一本极有价值的、发人深省的图书。”
——TechBookReport

  要成为一名优秀的面向对象设计人员,必须清楚地了解设计模式,不仅要知道它们是什么,还要知道如何利用它们解决实际问题。可惜这方面的书大部分仅给出脱离现实的、简单的例子,当中还充斥着不切实际的、教条的语汇,把这一课题复杂化了。
  为了解决这些问题,作者写了这本书供程序员阅读,并围绕两个较为复杂的例子展开讨论。书中把“四人组”所有的设计模式都用实际程序展现出来,更形象地说明了这些模式的工作原理和相互关系,以及在实际复杂应用中的使用。本书也谈到了面向对象程序设计的原则,以及如何在模式中应用这些原则,这样一来你就明白了模式是如何起作用的。本书还包含了“设计模式速查参考”,方便你在学习过程中随时查阅。
  阅读本书之前不需要了解设计模式(不过Java要懂一点),但读完本书后,你就能完全体会这些模式的使用方法,并能够在工作中轻松地使用它们。

图书特色

图书前言

本书介绍如何以面向对象的方式来编程,以及如何使用模式来解决面向对象系统中的常见问题。
  本书最基本的观点是:学习和理解设计模式的最佳方法是在实际代码中观察它们,这时你会发现各种模式混杂在一起,现实世界中的模式就是如此。
  因此,本书通过查看计算机程序的方式将设计模式呈现给你。我的意图是使得Gamma、Helm、Johnson和Vlissides的开创性著作《设计模式:可复用面向对象软件的基础》(AddisonWesley, 1995年,中文版已由机械工业出版社出版)更加清晰和易于理解。(这四个人经常被称为“四人帮”或“四人组”(GoF),他们的书也通常被称为“四人组”的书。)本书将“四人组”的书放在具体环境中讲解,按照设计模式在现实世界中的实际使用方式来演示和讲解设计模式。当你看完本书后,将接触到所有的“四人组”设计模式,而且是在真正的计算机程序环境中接触的。
  不要误解,本书不是要取代“四人组”的书,而是作为其补充。Gamma、Helm、Johnson和Vlissides的工作为面向对象设计作出了巨大贡献,没有他们的工作,本书当然也不会存在。不过“四人组”的书对于许多程序员来说太深奥且晦涩难懂,因此本书有其存在的必要。
  本书和其他设计模式的书相比是不合常规的,是“由内而外”的。本书不是对设计模式进行编目并在编目的每一节给出脱离现实的、简单的例子,而是讨论了两个计算机程序,讨论时使用的术语是这两个程序所使用的模式。你将看到模式在实际的程序中是什么样子以及模式是如何以复杂的方式彼此交织在一起的。
  设计模式编目方法(如设计模式原著的做法)将各个模式隔离了开来,不容易理解现实世界使用模式的方式。如果你以前已经使用过演示这些模式的代码的话,这种编目方法当然是很优秀的。但是如果你以前没有这类代码的编程经验,则这种编目方法会难以理解。同时,编目方法只能使你获得对设计模式知识性的理解,而几乎不能使你理解如何使用模式来编写实际的代码。
  预备知识
  本书假定你已经知道Java并至少使用Java编写过几个程序。特别是,我在书中大量地使用了匿名内部类,因此你必须熟练掌握该语法。同时你必须精通“核心”Java包(比如javaio)并具备用户界面体系(如Swing和AWT)的基本知识。这些在你学习语言的时候可能已经掌握了。
  本书还假定你已经掌握了面向对象编程的基础:继承、接口和多态等。本书后面会讨论到诸如extends的缺点之类的东西,为了使讨论有意义,你必须知道extends是做什么的。我假定你已经知道了其优点,所以不会再烦述面向对象语言特征诸如继承有什么优点。我在讨论某个编程惯用法或者语言特征的负面因素时,请不要认为该编程惯用法或者语言特征没有值得肯定的一面。我假定你已经知道的东西就不需要在书中讲解了。
  最后,我假定你对UML有初步的了解。UML(统一建模语言)是一种对设计的图形化表示法,可用于显示程序的静态(类)结构以及组成程序的对象在运行时是如何相互交互的。
  如果在你继续阅读本书之前需要在技术上更上一层楼的话,下面的“参考资料”一节中列出的Web页面给出了这些主题的所有参考资料。如果你没有真正理解UML,或许还可以应付过去;但如果对Java不熟悉的话,阅读本书将很困难。
假设
  本书假设你希望知道如何构建纯粹的面向对象解决方案,因此没有对基于该假定的每个陈述都加以特别说明。面向对象策略通常都包含基于过程的替代方案,但本书没有讨论这些替代方案。
  我之所以提起这些显而易见的东西,是为了防备一些不可避免的吹毛求疵者,他们会仅仅因为书中没有对每个问题都讨论所有的方案(包括忠实基于过程的方案)而抱怨说整本书都是错误的。
  本书有些话题会引发争议,包括对实现的封装(即指应该尽力避免使用大多数常用的get/set函数)和过度使用实现继承(这将创建不必要的耦合关系)。
注意!注意!本书将特立独行
  最后,我想强调一下我的行文风格。
  到目前为止你应该能看出来,我有什么想法就会说出来,我通常不会通过辩解来证明我的观点,如果你不喜欢这样,那就买其他书吧。
  每个人都有自己的观点,如果将这些观点隐藏在不偏不倚的虚饰之下,那么除了让人困惑外没有什么用处。你可以不同意我的观点,但请在你有了强有力的证据支持你的观点时再来和我争论。“没有人这样做”并不是强有力的证据,反之亦然:“每个人都这样做”也不是强有力的证据。
  有时我被指责为太“独断”。如果你所说的“独断”是指我激烈地捍卫我的思想(那些在实际代码中效果很好的思想),并且反过来对实践中很糟糕地失败了的思想大加贬低的话,那么我想我确实是独断的。但我自认为我是现实的,而不是独断的。我顽固地遵循着面向对象的准则,因为每次当我背离了这些准则时,都必须重写代码。我只是没有时间把同一件事做两次而已。
  我对实践的偏好反映在本书的结构中,本书的目录安排是围绕代码而不是学术化的分类学进行的。为了使有些内容易于理解,我没有严格遵循编程语言的语法,这可能会使你觉得有些不满。当然,本书是针对程序员,而不是针对理论家的。(很奇怪,有时我会被指责为太“学院派”,好像学院派是个贬义词一样。真正的学院派人士通常不喜欢我的书,因为我的书不够形式化,太多地依赖代码而不是数学。)
  有时本书也会离题到不相关的设计话题上,而不是严格关注于模式。我假定你不仅知道我在做什么,还知道为什么这样做。在写本书时,我们就像坐在桌子边上交谈一样,而不是我站在讲台上作正式的报告。如果你想要正式的东西,建议你阅读“四人组”的设计模式书籍。“四人组”的书是使用高度结构化的方式讲解这些内容的杰出著作,它可能更符合你的胃口。
参考资料
  本书没有加上“参考资源”一节来加大篇幅,因为这些内容在书籍面世之前就会过期,所以我建立了一个设计模式资源网页(http://wwwholubcom/goodies/patterns)。在该网页上你可以找到本书的所有代码,也可以找到参考书目以及其他与模式有关的Web站点的链接。
结束语
  既然前面已经提醒了你,现在到了开始工作的时间了。设计模式(以及用模式来思考)是杰出的东西,它们能使你的工作更有效率,使你的代码更加易于维护,并能为你提供交流的词汇,使得你与其他程序员和设计人员的交流更加有效。本书向你展示的是设计模式是如何真正起作用的,以及如何使用设计模式编写出优秀的代码。
致谢
  当然要向“四人组”(Gang of Four): Gamma、Helm、Johnson和Vlissides致以极大的感谢。如果没有他们,本书也不会存在。
  Ken Arnold精心审阅了本书,我从来没有见过像Ken这样透彻而细心的技术审稿人。他提出的详细意见极大地改进了本书,对此我十分感激。
  本书的一小部分出自我在JavaWorld(http://wwwjavaworldcom)上的Java Toolbox专栏中的内容。

封底文字

“不论你是否同意Holub的各种观点,有一点不可否认,这是一本极有价值的、发人深省的图书。” ——TechBookReport 要成为一名优秀的面向对象设计人员,必须清楚地了解设计模式,不仅要知道它们是什么,还要知道如何利用它们解决实际问题。可惜这方面的书大部分仅给出脱离现实的、简单的例子,当中还充斥着不切实际的、教条的语汇,把这一课题复杂化了。 为了解决这些问题,作者写了这本书供程序员阅读,并围绕两个较为复杂的例子展开讨论。书中把“四人组”所有的设计模式都用实际程序展现出来,更形象地说明了这些模式的工作原理和相互关系,以及在实际复杂应用中的使用。本书也谈到了面向对象程序设计的原则,以及如何在模式中应用这些原则,这样一来你就明白了模式是如何起作用的。本书还包含了“设计模式速查参考”,方便你在学习过程中随时查阅。 阅读本书之前不需要了解设计模式(不过Java要懂一点),但读完本书后,你就能完全体会这些模式的使用方法,并能够在工作中轻松地使用它们。

作者简介

Allen Holub:Allen Holub: 在美国加州大学伯克利分校获得计算机科学学士学位。他在计算机行业从事了24年的研究工作,研究方向涉及:面向对象技术、Java程序设计、硬件设计、操作系统、应用程序设计和用户界面设计等。Allen Holub著述丰富,包括:《Taming Java Threads》、《C+C++: Programming With Objects in C and C++》、《The C Companion》等。

译者简介

徐迎晓:徐迎晓: 徐迎晓,博士。现为复旦大学教师,硕士生导师,在软件学院讲授多门面向对象技术相关课程。1989~1996年就读于东南大学机械工程系,获工学学士、硕士学位。1999~2002年就读于复旦大学计算机系,获理学博士学位。曾获江苏省科技进步四等奖、被评为上海市优秀青年教师等。曾任教上海大学,多年从事网络设计与管理、软件开发、Novell及SUN Java认证培训等。编著《Java语法及网络应用设计》、《Java安全性编程实例》等多本书籍。

译者序

有关设计模式已经有大量的书籍面世,但本书还是令我的眼睛为之一亮。翻开前面两章,首先被作者关于模式的生动比喻所吸引,“穿堂风”模式和“角落办公室”模式使我们很轻松地熟悉了有关模式的基本概念,也纠正了很多人普遍会有的错误思维。作者在很多地方直言不讳,观点鲜明,文风诙谐,对微软进行了多次毫无顾忌的嘲讽,对Java本身的某些设计失误也作了较深入的分析,这些都给我留下了深刻的印象。
  本书前两章的内容不仅和模式有关,也对面向对象技术作了不少讨论。书中的很多观点为我们打开了另一扇窗户,让我们关注到平时不大注意的问题。比如对脆弱的基类问题以及extends的缺点的大量分析、对get/set方法的批判、对模板方法模式所存在的问题的分析等。在作者的网站中有个幻灯片,标题是“你所知道的一切都是错误的!”(Everything You Know is Wrong!),该标题作为本书特点的写照颇为合适。
  在对模式的讲解中,本书让我印象最深的地方有两点:一是模式的代码实现与众不同;二是全书通过两个完整的例子来讲解模式。
  很多设计模式书籍中的代码实现都大同小异,而本书中的代码实现则大量使用了匿名内部类,给人耳目一新的感觉,很有启发性。通过案例讲解模式在很多设计模式书籍中已非鲜见,但本书中的案例还是非常独特。第一个案例“生命游戏”非常有趣,尽管作者为了讲解模式强行塞进去很多模式,但其中的模式应用还是能给我们不少启发。第二个案例“嵌入式SQL”是产品级代码,更具挑战性,书中对其体系结构以及模式应用作了详细的分析。尤其有特色的是,两个案例中的模式应用都不像其他的设计模式书籍中的案例那样理想化,而是将各种模式以错综复杂的关系交织在一起,经常是一个类参与多个模式,这真实反映了现实世界中模式应用的情况。为了表现这种错综复杂的关系,两个案例都使用了模式图以及UML类图,尤其是模式图起到了很好的效果。
  只要学习过一种面向对象编程语言,各种层次的读者都可以从本书中汲取到有用的内容。随着翻译的进展,我在讲授各个层次的面向对象技术相关课程时,穿插了本书中的绝大部分内容。如果读者以前从来没有接触过面向对象分析与设计,阅读本书会有一点难度,可先涉猎一些面向对象分析与设计的初步知识;如果以前从来没有接触过设计模式,本书的很多内容还是偏难些,应该在阅读到相关模式时针对相应的模式先参考一下网上或者其他书籍中一些基础的内容。
  翻译是一项费时费力的浩大工程,尽管我们在翻译过程中尽力做到完美,但每一遍的校译都会发现一些新的值得改进之处。读者可以在译者的网站http://javabook126com中找到译者的联系方式并进行意见反馈。
  本书翻译过程中,周逸勋、李波、谢维分别翻译了第3、4章和附录,徐迎晓翻译其他内容并负责全面的校译与润色,刘昉参与了各章的校译以及疑难翻译的讨论。

徐迎晓
2006年8月于复旦大学

图书目录

第1章面向对象与设计模式初步
11模式和惯用法
12究竟什么是设计模式
13模式究竟有什么用途
14模式在设计中所充当的角色
15模式的分类
151有关设计的一般性讨论
152使用Java按照FORTRAN方式来编程
153睁大眼睛来编程
16对象
161胡言乱语
162对象是一组能力
163事情是如何做错的
164如何将事情做“对”
17细胞自动机
18getter和setter方法是有害的
181描绘你自己
182JavaBeans和Struts
183重构
184没有get/set的生活
185何时可以使用访问器和修改器
186getter/setter问题总结
第2章使用接口和创建型模式编程
21为什么extends是有害的
22接口和类
221灵活性的丢失
222耦合
223脆弱的基类问题
224多重继承
225框架
226模板方法和工厂方法模式
227“脆弱的基类”问题总结
23什么时候使用extends合适
24消除extends
241工厂和单例模式
242单例
243单例中的线程问题
244双检测锁定
245销毁单例
246抽象工厂
247模式大杂烩
248工厂模式中的动态创建
249命令和策略模式
25总结
第3章生命游戏
31获得生命
32绘制生命游戏的结构图
33时钟子系统:观察者模式
34时钟子系统:访问者模式
35菜单子系统:合成模式
36菜单子系统:门面模式
37MenuSite类
38核心类
381Universe类
382Cell接口
383Resident类
384Neighborhood类
39调停者模式
310重温合成模式
311再访合成模式
312享元模式
313备忘录模式
314零散的结尾
315总结
第4章实现嵌入式SQL
41需求
42体系结构
43数据存储层
431表接口
432桥梁模式
433使用抽象工厂模式创建表接口
434使用被动迭代器和建造者模式创建和保存表
435填充表
436查看表的内容:迭代器模式
437使用命令模式实现事务(撤销操作)系统
438修改表:策略模式
439select与join操作
4310杂项
4311表的变化形式:装饰模式
44加入SQL语言
441SQL引擎层的结构
442对输入作断词、享元模式重访和责任链模式
443词法分析器:责任链模式
444ParserFailure类
45Database类
451使用Database类
452代理模式
453词符集和其他常量
46解释器模式
461对SQL的支持
462观察运行中的解释器
47JDBC层
48状态模式和JDBCConnection
481执行SQL语句
482适配器模式
483完成代码
484如果桥梁模式失效
附录  设计模式速查参考
创建型模式
结构型模式
行为型模式


参考读物推荐
作者: [美] 马特·魏斯费尔德(Matt Weisfeld)著
作者: (美)Capers Jones(法)Olivier Bonsignour 著
作者: Joshua Barnes
作者: [美]詹姆斯·肖尔(James Shore) [美]黛安娜·拉森(Diana Larsen) [丹]吉特·克里特加德(Gitte Klitgaard) [美]谢恩·瓦尔登(Shane Warden) 著