目录
序
你的大脑是如何理解设计模式的?此时,你正在设法学习些知识,而你的大脑要通过确认这些知识来给你提供支持。你的大脑在想:“最好出去做些更重要的事情,就象消灭野兽或者光着身子滑雪不是个好主意”。所以你要怎么样让你的大脑认为你的生死存亡都依赖于设计模式的知识?
1.Welcome to Design Patterns - 设计模式介绍
有人已经解决了你的问题。在这章里,你将学习到为什么(和怎么样)你可以使用其他已经走过相同设计问题的路并幸存下来的开发者的智慧和教训。在我们做之前,我们将先看看设计模式的用途和好处,再看一些关键的面向对象设计原则,并且再通过一个实例了解模式的工作方式。使用模式最好的方法就是把它们装入脑袋里,然后在你设计和现有的应用程序里认出你能够应用它们的地方。相对于代码重用,使用模式你获得了经验的重用。
模拟鸭子
乔相对继承
利用接口怎么样?
软件开发的一个不变的真理
分开变动和不变动的部分
设计鸭子的行为
测试鸭子的代码
动态地设置行为
封装行为的大局观
『有一個』可能比『是一個』更好
策略模式
共享模式词汇的力量
我如何使用设计模式?
设计工具箱里的工具
练习解答
2.Keeping your Objects in the Know - 观察者模式
不要遗漏有趣的事情!我们已经有一个模式,它可以使你的对象知道它们关心的某些事情在发生的时候的内幕。对象甚至可以决定是否在运行的时候仍然知道内幕(be kept informed)。观察者模式是JDK中使用最多的模式之一,它是难以置信的有用。在我们做之前,我们同样先看看一对多关系和释放偶合(是,就是它,我们说偶合). 同观察者一起,你们将是模式大家庭的一员。
气象检测系统
认识观察者模式
出版者 + 订阅者 = 观察者模式
五分钟短剧: 值得观察的主题
定义观察者模式
松偶合的力量
设计气象站
实现气象站
使用Java内建的观察者模式
java.util.Observable 的黑暗面
设计工具箱里的工具
练习解答
3.Decorating Objects - 装饰者模式
就叫这章为"继承的设计眼光"("Design Eye for the Inheritance
Guy")。我们将重新检查继承的典型的过度使用,同时你将学习到在运行的时候怎么样使用对象组合的方式来装饰你的类。为什么?一旦你熟悉了装饰的技巧,你将可以在不修改任何基础的类的情况下给你的(或其他人的)对象赋予新的职责。
欢迎来到星巴兹咖啡
开放关闭原则
认识装饰者模式
使用装饰者构建饮料订单
定义装饰者模式
装饰饮料
写下星巴茲的代码
真实世界的装饰者:Java I/O
设计自己的 Java I/O 装饰者
设计工具箱里的工具
练习解答
4.Baking with OO Goodness - 工厂模式
准备好来设计一些松偶合的面向对象的设计。除了使用new操作以外,还有很多制造对象的方法。你将学习到 实例化(instantiation)是一种不总是公开的被执行并且能够经常导致偶合问题的一种行为。然而,你不希望那样,不是吗?发现工厂模式怎么把你从糟糕的依赖关系中拯救出来。
当看到『new』,就要联想到『具体』
对象村比萨
封裝创建对象的代码
建立一个简单的比萨工厂
定义简单工厂
给比萨店使用的框架
允许子类做决定
让我们开一家比萨店
声明一个工厂方法
认识工厂方法模式
平行的类层次
定义工厂方法模式
一个很依赖的比萨店
看看对象的依赖性
依赖倒置原则
回到比萨店...
原料家族
建立原料工厂
看看抽象工厂
幕后花絮
定义抽象工厂模式
比较工厂方法和抽象工厂
设计工具箱里的工具
练习解答
5.One of a Kind Objects - 单态模式
单态模式:你用来创建哪些只有一个实例的对象的入场卷。你可能因为在所有的模式的类图中单态的类图是最简单的而高兴;事实上它的类图只有一个单独的类!但是不要太乐观;尽管从类图上看它非常简单,但是我们实现它的时候将遭遇相当多阻挠和陷阱。所以,清醒一下-它并不像看起来那么简单……
独一无二
小小单态
剖析经典单态模式
单态的供认
巧克力工厂
定义单态模式
休斯顿,我们遇到麻烦了...
化身为 JVM
处理多线程
单态的 Q&A
设计工具箱里的工具
练习解答
6.Encapsulating Invocation - 命令模式
在这章里我们要把封装带到一个全新的层次:我们将封装方法的调用。是啊,通过封装调用我们可以明确一系列的计算(computation),所以对象在调用计算(computation)的时候不需要关心它是怎么做的;它仅是使用我们明确的方法来获得行为。我们还可以使用封装方法调用的方式来做一些耍小聪明(wickedly smart)的事情,例如在我们的代码记录请求日志或重用它们来实现撤销功能。
家电自动化公司
遥控器
看一下厂商的类别
同時,回到餐厅...
研究餐厅的互动过程
对象村餐厅的角色和责任
从餐厅到命令模式
第一个命令对象
定义命令模式
命令模式与遥控器
实现遥控器
逐步测试遥控器
写文件的时候到了
使用状态实现撤消
每个遥控器都需要具备集合形式!
使用宏命令
命令模式的更多用途:队列请求
命令模式的更多用途:日志请求
设计工具箱里的工具
练习解答
7.Being Adaptive - 适配器和门面模式
在这章里我们将尝试一些不可能的技艺,就象把一个正方形的木栓插入一个圆孔中。在我们还没有设计模式的时候这听起来是不可能的?你还记得装饰者模式吗?我们通过包装一个对象来赋予它新的职责。现在我们将包装一些不同用途的对象:使它们的接口看起来象是其它东西。我们为什么要这么做呢?因为这样我们可以把一个接口改装成不同的接口。这些并不是全部,我们还将看到另一个模式,它可以通过包装对象来简化它们的接口。
我们周围的适配器
OO适配器
解释适配器模式
定义适配器模式
对象和类的适配器
今晚的话题:对象适配器和类适配器
真实世界的适配器
将列举适配到迭代器
今晚的话题:装饰者模式和适配器模式
甜蜜的家庭剧院
灯光,照机,门面!
构建家庭剧院的门面
定义门面模式
「认识最少」原则
设计工具箱里的工具
练习解答
8.Encapsulating Algorithms - 模板方法模式
我们已经封装了对象的创建,方面的调用,联合的接口,鸭子,比萨饼...下一个封装什么?我们将开始考虑封装算法,所以使子类在任何时候都可以正确地挂钩(hook)自己到算法中。我们还有学习一个从好莱坞得到的灵感的设计原则。
写一些咖啡和茶的类
抽象咖啡和茶
更进一步的设计
抽象PrepareRecipe()
我们做了什么?
认识模板方法
让我们泡茶去
模板方法带给我们什么?
定义模板方法模式
再靠近一点
对模板方法进行挂钩
使用挂钩
咖啡?茶?执行测试程序
好莱坞原则
好莱坞原则和模板方法
荒野中的模板方法
用模板方法排序
排序鸭子
比较鸭子
排序鸭子的制造方法
写一个Swing 的视窗程序
Applet
今晚的话题:模板方法和策略方法
设计工具箱里的工具
练习解答
9.Well-Managed Collections - 迭代器和合成模式
有很多方法可以把对象填充到集合里。把它们放到数组里,堆栈里,列表里,地图里,随你便。每种方法都有自身的优缺点。但是当你的客户想要从头到尾迭代你的对象的时候,你是否需要展示你的实现方式。我们确信不需要!那是不专业的。不用担心-在这章里你将了解到怎么样使你的客户在不了解你是怎么样存储对象的情况下就可以从头到尾地迭代你的对象。你可以学习到怎么样创建一些强大的对象集合,这些集合中的对象能够在一个单一的绑定中跳过一些特定的数据结构。你还可以学习到一两件关于对象职责的事情。
合并对象村餐厅和煎饼屋
比较菜单的实现方式
我们可以封装迭代操作吗?
认识迭代器模式
在餐厅菜单中加入一个迭代器
看看现在的设计
使用java.util.Iterator改写程序
这给我们带来了什么?
定义迭代器模式
单一责任
迭代器和集合
Java 5 的迭代器和集合
正当我们认为这很安全的时候...
定义合成模式
使用合成设计菜单
实现合成菜单
倒叙到迭代器
空迭代器
迭代器和合成在一起的魔力...
设计工具箱里的工具
练习解答
10.The State of Things - 状态模式
公认的事实:策略和状态模式是孪生兄弟。就象你所知道的,策略模式通过可互换的算法规则来创建非常成功的业务模式(wildly successful business)。不管怎么样,状态以非常高尚的方式帮助对象学习通过他们内部的状态来控制他们的行为。他总是无意中告诉他的对象客户,"跟着我重复就行了,我足够好,我足够聪明,..."
我们怎么样实现状态
状态机
第一版状态机
该来的躲不掉...需求改变!
混乱的状态...
定义状态的接口和类
实现我们的状态类
重新改造糖果机
定义状态模式
状态模式vs策略模式
状态精神检查
我们差点忘了!
设计工具箱里的工具
练习解答
11.Controlling Object Access – 代理模式
究竟扮演好警察还是坏警察?你是一个好警察,你所有的服务都很和蔼和友好,但是你不想所有人都要求你的服务,所以你需要坏警察来控制对你的访问。那就是代理要做的事情:控制和管理访问。就象你将看到的一样,有很多方法可以代表他们代理的对象。代理可以在网络上为他们代理的对象的完整的方法访问改变方向(Proxies have been known to haul entire method calls over the Internet for their proxied objects);代理还可以持久地替代一些可爱的懒对象。
监控糖果机
远程代理的角色
RMI巡礼
糖果机远程代理
远程代理幕后花絮
定义代理模式
准备虚拟代理
设计CD封面的虚拟代理
虚拟代理的幕后花絮
使用 Java API 的代理
五分钟短剧:保护主角
建立动态代理
代理动物园
设计工具箱里的工具
练习解答
12.Patterns of Patterns – 复合模式
谁曾经会想到模式能够在一起工作?你已经亲眼目睹了激烈的家庭辩论(并且感谢你没有不得不看到出版商强迫我们从书里移除的模式死亡竞赛(Pattern Death Match),所以我们能够避免不得已去使用模式警告标签),所以谁将会考虑到模式可以在实际中融洽相处?你是否相信,一些最强大的OO设计都同时使用了多个模式。准备好提升你的模式技巧到下一个层次;该是介绍复合模式的时候了。要小心-你的同事可能会杀了你,如果你由于对模式的狂热而罢工的话。
复合模式
鸭子重出江湖
加入一个适配器
加入一个装饰者
加入一个工厂
加入一个合成和一个迭代器
加入一个观察者
模式总结
从鸭子的角度看类图
Model-View-Controller 之歌
设计模式是MVC的关键
戴上模式的有色眼睛看 MVC
使用MVC控制节拍…
Model
View
Controller
探索策略模式
Model的适配
现在我们已经准备好心脏控制器
将MVC应用于Web
设计模式与Model
设计工具箱里的工具
练习解答
13.Patterns in the Real World – 与设计模式相处
现在你已经准备好已经一个充满设计模式的时间。但是,当你打开所有机会大门之前,我们要告诉你一些在真实世界会遇到的细节—外面的世界比对象村要复杂。来吧,我们会给你指引方向,帮助你适应…
对象村指南
定义设计模式
更仔细地观察设计模式的定义
愿力量与你同在
模式目录
怎么样创建模式
想当一个设计模式作家吗?
组织设计模式
用模式思考
模式的心智
不要忘了共通词汇表的力量
共同词汇表的五种方式
和四人帮一同巡回对象村
你的旅途刚开始…
其他设计模式的资源
模式动物园
用反模式消灭恶势力
设计工具箱里的工具
离开对象村…
14.附录:剩下的模式
并非所有人都能成为最受欢迎的人。过去里改变了很多事情。自从<设计模式-可复用面向对象软件的基础>一书出版以来,开发者已经应用了无数次那些模式。我们在这个附录里总结的模式都是标准的,正式的GOF模式,但是它们在我们以往的探索中并不经常被使用。但是这些模式都有存在的价值,如果你设身处地的为它们着想,你将使用你的头脑更深入地掌握它们。我们在这个附录里的目标就是带给你关于所有这些模式的更高层次的观点。
桥梁模式
建造者模式
责任链模式
享元模式
翻译者模式
协调者模式(Mediator)
纪念品模式(Memento)
原形模式
访问者模式
//----------------------------题外话-------------------------------------
经过几天空余时间的努力,终于翻译完了这本书的第一部分:目录.由于是第一次正式翻译东西,肯定有很多地方都不准确,大家一定要带着怀疑的目光去看我的译文,帖出来也是希望大家多提宝贵意见.由于这本书里使用了大量生动有趣的图片和无处不在的比喻,所以大家最好弄一本书来看,然后我们再到这里一起交流心得,我会坚持把以后的章节都翻译出来的.
作者:Justin
出处: /