常用设计模式及 Java程序设计
第一章设计模式基础
一:什么是设计模式
在面向对象的软件设计中,总是希望避免重复设计或尽可能少做重复设计。有经验的面向对象
设计者的确能做出良好的设计,而新手则面对众多选择无从下手,总是求助于以前使用过的非面向
对象技术。有经验的设计者显然知道一些新手所不知道的东西,这又是什么呢?
内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用过的解决方案。
当找到一个好的解决方案,他们会一遍又一遍地使用。这些经验是他们成为内行的部分原因。它们
帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。一个熟悉这些模式的
设计者不需要再去发现它们,而能够立即将它们应用于设计问题中。
设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计
模式也会使新系统开发者更加容易理解其设计思路。设计模式帮助你做出有利于系统复用的选择,
避免设计损害了系统复用性。通过提供一个显式类和对象作用关系以及它们之间潜在联系的说明规
范,设计模式甚至能够提高已有系统的文档管理和系统维护的有效性。简而言之,设计模式可以帮
助设计者更快更好地完成系统设计。
1:什么是设计模式
Christopher Alexander 说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以
及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。尽管Al
exande r所指的是城市和建筑模式,但他的思想也同样适用于面向对象设计模式,只是在面向
对象的解决方案里,我们用对象和接口代替了墙壁和门窗。两类模式的核心都在于提供了相关问题
的解决方案。
一般而言,一个模式有四个基本要素:
模式名称(pattern name)
一个助记名,它用一两个词来描述模式的问题、解决方案和效果。
问题(problem)
描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的
设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问
题部分会包括使用模式必须满足的一系列先决条件。
解决方案(solution)
描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模
板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计
问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
效果(consequences)
描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式
效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对
时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模
式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些
模式很有帮助。出发点的不同会产生对什么是模式和什么不是模式的理解不同。一个人的模式对另
一个人来说可能只是基本构造部件。
二:设计模式怎样解决设计问题
设计模式采用多种方法解决面向对象设计者经常碰到的问题。这里给出几个问题以及使用设计
模式解决它们的方法。
1:寻找合适的对象
面向对象程序由对象组成,对象包括数据和对数据进行操作的过程,过程通常称为方法或操作。
对象在收到客户的请求(或消息)后,执行相应的操作。
客户请求是使对象执行操作的唯一方法,操作又是对象改变内部数据的唯一方法。由于这些限
制,对象的内部状态是被封装的,它不能被直接访问,它的表示对于对象外部是不可见的。
面向对象设计最困难的部分是将系统分解成对象集合。因为要考虑许多因素:封装、粒度、依
赖关系、灵活性、性能、演化、复用等等,它们都影响着系统的分解,并且这些因素通常还是互相
冲突的。
面向对象设计方法学支持许多设计方法。你可以写出一个问题描述,挑出名词和动词,进而创
建相应的类和操作;或者,你可以关注于系统的协作和职责关系;或者,你可以对现实世界建模,
再将分析时发现的对象转化至设计中。至于哪一种方法最好,并无定论。
设计的许多对象来源于现实世界的分析模型。但是,设计结果所得到的类通常在现实世界中并
不存在,有些是像数组之类的低层类,而另一些则层次较高。设计中的抽象对于产生灵活的设计是
至关重要的。
设计模式帮你确定并不明显的抽象和描述这些抽象的对象。例如,描述过程或算法的对象现实
中并不存在,但它们却是设计的关键部分。
2 决定对象的粒度
对象在大小和数目上变化极大。它们能表示下自硬件或上自整个应用的任何事物。那么我们怎
样决定一个对象应该是什么呢?设计模式很好
1