本书通过最新的Java特征和最佳实践阐释了经典著作《设计模式》中介绍的23种基本设计模式。作者根据自己丰富的编程经验,用实际的Java 5.0程序、清晰的UML图表以及引人入胜的实践讲述了每个模式。书中每章集中讨论一种特定的模式,之后给出一些自我突破题,自我突破题或者启发读者思考,或者要求编写代码来解决某个问题,有助于更深入地理解书中的概念。\r\n 本书适合于各层次的Java开发人员阅读。
第1章 设计模式介绍 1\r\n1.1 为什么使用模式 1\r\n1.2 为什么使用设计模式 2\r\n1.3 为什么使用Java 2\r\n1.4 UML 3\r\n1.5 自我突破 3\r\n1.6 本书的组织方式 3\r\n1.7 欢迎来到Oozinoz公司 4\r\n1.8 小结 5\r\n第一部分 接口型模式\r\n第2章 接口型模式介绍 8\r\n2.1 接口和抽象类 8\r\n2.2 接口和责任 9\r\n2.3 小结 10\r\n2.4 超越普通接口 10\r\n第3章 Adapter(适配器)模式 11\r\n3.1 接口适配 11\r\n3.2 类和对象适配器 14\r\n3.3 为JTable适配数据 16\r\n3.4 标识适配器 20\r\n3.5 小结 20\r\n第4章 Facade(外观)模式 21\r\n4.1 外观类、工具类和示例类 21\r\n4.2 重构为Facade模式 22\r\n4.3 小结 29\r\n第5章 Composite(组合)模式 30\r\n5.1 常见的组合 30\r\n5.2 Composite模式的递归特性 31\r\n5.3 组合、树和环 32\r\n5.4 含有环的Composite模式 35\r\n5.5 环的影响 38\r\n5.6 小结 39\r\n第6章 Bridge(桥接)模式 40\r\n6.1 经典范例:普通抽象 40\r\n6.2 从抽象到Bridge模式 42\r\n6.3 应用Bridge模式的驱动程序 43\r\n6.4 数据库驱动程序 44\r\n6.5 小结 45\r\n第二部分 责任型模式\r\n第7章 责任型模式介绍 48\r\n7.1 常见的责任型模式 48\r\n7.2 通过可见性属性控制责任 49\r\n7.3 小结 50\r\n7.4 超越普通责任型模式 50\r\n第8章 Singleton(单例)模式 51\r\n8.1 Singleton模式机制 51\r\n8.2 单例和线程 52\r\n8.3 识别单例 53\r\n8.4 小结 54\r\n第9章 Observer(观察者)模式 55\r\n9.1 经典范例:GUI中的Observer模式 55\r\n9.2 模型/视图/控制器 58\r\n9.3 维护Observable类对象 62\r\n9.4 小结 64\r\n第10章 Mediator(中介者)模式 65\r\n10.1 经典范例:GUI的Mediator模式 65\r\n10.2 利用Mediator模式管理关系完整性 68\r\n10.3 小结 73\r\n第11章 Proxy(代理)模式 74\r\n11.1 经典范例:图像代理 74\r\n11.2 重新思考图像代理 78\r\n11.3 远程代理 79\r\n11.4 动态代理 84\r\n11.5 小结 87\r\n第12章 Chain of Responsibility(责任链)模式 88\r\n12.1 常见的责任链 88\r\n12.2 重构为Chain of Responsibility模式 89\r\n12.3 固定责任链 91\r\n12.4 不带组合结构的Chain of \r\nResponsibility模式 92\r\n12.5 小结 93\r\n第13章 Flyweight(享元)模式 94\r\n13.1 不变性 94\r\n13.2 提取享元中不可变的部分 95\r\n13.3 共享享元 96\r\n13.4 小结 99\r\n第三部分 构造型模式\r\n第14章 构造型模式介绍 102\r\n14.1 普通构造的挑战 102\r\n14.2 小结 103\r\n14.3 超越普通构造 103\r\n第15章 Builder(生成器)模式 105\r\n15.1 常见的生成器 105\r\n15.2 根据约束构造对象 107\r\n15.3 根据不完整信息构造符合约束的对象 109\r\n15.4 小结 109\r\n第16章 Factory Method(工厂方法)模式 110\r\n16.1 经典范例:迭代器 110\r\n16.2 识别Factory Method模式 111\r\n16.3 决定要实例化的对象 111\r\n16.4 并行层次结构中的Factory Method模式 112\r\n16.5 小结 114\r\n第17章 Abstract Factory(抽象工厂)模式 115\r\n17.1 经典范例:GUI工具包 115\r\n17.2 抽象工厂和工厂方法 118\r\n17.3 包和抽象工厂 121\r\n17.4 小结 122\r\n第18章 Prototype(原型)模式 123\r\n18.1 作为工厂的原型 123\r\n18.2 利用克隆进行原型化 124\r\n18.3 小结 126\r\n第19章 Memento(备忘录)模式 127\r\n19.1 经典范例:使用备忘录实现撤销操作 127\r\n19.2 备忘录的持久性 132\r\n19.3 跨越会话的持久性备忘录 132\r\n19.4 小结 135\r\n第四部分 操作型模式\r\n第20章 操作型模式介绍 138\r\n20.1 操作和方法 138\r\n20.2 签名 139\r\n20.3 异常 139\r\n20.4 算法和多态性 140\r\n20.5 小结 141\r\n20.6 超越普通操作 141\r\n第21章 Template Method(模板方法)模式 142\r\n21.1 经典范例:排序 142\r\n21.2 完成算法 145\r\n21.3 Template Method模式钩子 147\r\n21.4 重构为Template Method模式 148\r\n21.5 小结 149\r\n第22章 State(状态)模式 150\r\n22.1 状态建模 150\r\n22.2 重构为State模式 153\r\n22.3 使状态成为常量 156\r\n22.4 小结 157\r\n第23章 Strategy(策略)模式 158\r\n23.1 策略建模 158\r\n23.2 重构为Strategy模式 160\r\n23.3 比较Strategy模式和State模式 163\r\n23.4 比较Strategy模式和Template Method模式 164\r\n23.5 小结 164\r\n第24章 Command(命令)模式 165\r\n24.1 经典范例:菜单命令 165\r\n24.2 使用Command模式提供服务 167\r\n24.3 Command模式钩子 168\r\n24.4 Command模式与其他模式的关系 169\r\n24.5 小结 170\r\n第25章 Interpreter(解释器)模式 171\r\n25.1 Interpreter模式范例 171\r\n25.2 解释器、语言和解析器 180\r\n25.3 小结 180\r\n第五部分 扩展型模式\r\n第26章 扩展型模式介绍 184\r\n26.1 面向对象设计原则 184\r\n26.2 Liskov替换原则(LSP) 184\r\n26.3 Demeter法则 185\r\n26.4 消除代码坏味 186\r\n26.5 超越普通的扩展 187\r\n26.6 小结 187\r\n第27章 Decorator(装饰器)模式 188\r\n27.1 经典范例:流和输出器 188\r\n27.2 函数包装器 193\r\n27.3 与其他模式相关的Decorator模式 199\r\n27.4 小结 199\r\n第28章 Iterator(迭代器)模式 200\r\n28.1 常规迭代 200\r\n28.2 线程安全的迭代 201\r\n28.3 对组合结构进行迭代 206\r\n28.3.1 组合枚举器的深度 211\r\n28.3.2 枚举叶节点 212\r\n28.4 小结 213\r\n第29章 Visitor(访问者)模式 214\r\n29.1 Visitor模式机制 214\r\n29.2 常见的Visitor模式 216\r\n29.3 Visitor模式循环 220\r\n29.4 Visitor模式危机 223\r\n29.5 小结 224\r\n第六部分 附录\r\n附录A 指南 226\r\nA.1 从本书中学到更多 226\r\nA.2 理解设计模式的典型范例 226\r\nA.3 在实践中应用设计模式 227\r\nA.4 不断地学习 228\r\n附录B 参考答案 229\r\nB.1 接口型模式介绍(第2章) 229\r\nB.2 Adapter(适配器)模式(第3章) 230\r\nB.3 Façade(外观)模式(第4章) 233\r\nB.4 Composite(组合)模式(第5章) 235\r\nB.5 Bridge(桥接)模式(第6章) 237\r\nB.6 责任型模式介绍(第7章) 239\r\nB.7 Singleton(单例)模式(第8章) 240\r\nB.8 Observer(观察者)模式(第9章) 241\r\nB.9 Mediator(中介者)模式(第10章) 245\r\nB.10 Proxy(代理)模式(第11章) 248\r\nB.11 Chain of Responsibility(责任链)模式(第12章) 249\r\nB.12 Flyweight(享元)模式(第13章) 252\r\nB.13 构造型模式介绍(第14章) 254\r\nB.14 Builder(生成器)模式(第15章) 255\r\nB.15 Factory Method(工厂方法)模式(第16章) 257\r\nB.16 Abstract Factory(抽象工厂)模式(第17章) 260\r\nB.17 Prototype(原型)模式(第18章) 262\r\nB.18 Memento(备忘录)模式(第19章) 264\r\nB.19 操作模式介绍(第20章) 266\r\nB.20 Template Method(模板方法)模式(第21章) 267\r\nB.21 State(状态)模式(第22章) 268\r\nB.22 Strategy(策略)模式(第23章) 270\r\nB.23 Command(命令)模式(第24章) 271\r\nB.24 Interpreter(解释器)模式(第25章) 274\r\nB.25 扩展型模式介绍(第26章) 275\r\nB.26 Decorator(装饰器)模式(第27章) 276\r\nB.27 Iterator(迭代器)模式(第28章) 278\r\nB.28 Visitor(访问者)模式(第29章) 279\r\n附录C Oozinoz源代码 282\r\nC.1 获取和使用源代码 282\r\nC.2 构建Oozinoz源代码 282\r\nC.3 使用JUnit测试代码 282\r\nC.4 自己查找文件 283\r\nC.5 小结 283\r\n附录D UML概览 284\r\nD.1 类 284\r\nD.2 类间关系 285\r\nD.3 接口 286\r\nD.4 对象 287\r\nD.5 状态 288\r\n词汇表 289\r\n参考文献 294\r\n索引 296\r\n设计模式列表 308
Steven John Metsker是世界知名的面向对象技术专家,在设计模式方面造诣颇深。除本书外,他还出版了Building Parsers with java和Design Patternsin C#等著作,并为许多技术杂志撰写了大量技术文章。
设计模式就是对面向对象设计过程中常见问题的类一级或者方法一级的解决方案。本书所面向的读者是那些想更上一层楼的初中级Java程序员,以及还没有学习过设计模式的高级Java程序员。
本书采用类似于工具书的组织方式,每章集中讨论一种特定的模式。除了解释这个模式之外,每章还包含大量的自我突破题,每道题都要求读者解释某件事情,或者编写代码来解决某个问题。
我们强烈要求读者在阅读本书时,仔细做完这些自我突破题,而不要跳过。通过完成这些自我突破题,你将会学到更多的东西,即使你一周只能学习一至两章的内容。
修订版本
本书集成并修订了Design Pattern Java WorkbookTM和Design Pattern in C#两本书的内容。本书综合了第一本书面向Java语言的特点,以及第二本书独立的陈述方法。如果你已经深入学习了前面两本书,则不用再学习本书了。
代码约定
本书的所有代码均可在线获取。欲了解获取代码的详细方法,参见附录C。
我们使用通用的代码风格,和Sun公司的代码约定保持一致,还省略了所有可以忽略的括号。为适应本书的格式,我们在某些方面做了一定折中。为了适应本书的版面,变量名有时会短于实际中所应用的。为了避免源代码控制过于复杂,我们在名称的后面使用一个数字表示其版本号(如ShowBallistics2)。在实际工作中,你最好使用源代码控制,并且仅使用最新版本的类。
致谢
写书是一件具有挑战性的事情。许多审稿人对本书提出了非常有价值的建议,感谢Daryl Richter、Adewale Oshineye、Steven M. Luplow、Tom Kubit、Rex Jaeschke、Jim Fox和David E. DeLano。他们每个人的建议都使得本书的质量得以改善。早期版本的读者以及审稿人也做出了同样的贡献。
同样要感谢Addison-Wesley出版社的所有编辑,特别是Chris Guzikowski、Jessica D’Amico以及Tyrrell Albaugh。其他编辑,包括Mary O’Brien以及John Wait,也对本书做出了贡献。
感谢最近过世的John Vlissides对写作本书以及其他图书的鼓励和建议。John是“软件模式系列”丛书的主编、《设计模式》一书的合著者、我的朋友,感谢他赋予我灵感。
除了很大程度上依赖于《设计模式》一书外,我们还吸收了许多其他图书的优点。特别是《UML用户指南》[Booch、Rambaugh和Jacobsen,1999] 对UML的详细解释。Java™ in a Nutshell [Flanagan,2005]简洁和清晰地介绍了Java语言,对我触动很大。The Chemistry of Fireworks[Russell,2000]则提供了有关焰火的知识。
最后,我们非常感激出版公司所有员工的辛勤劳动,是他们使此书得以印制出版。
Steve Metsker (Steve.Metsker@acm.org)
Bill Wake (William.Wake@acm.org)
无封面