《设计模式解析》第5章知识点介绍
《设计模式解析》第5章知识点介绍
第5章
设计模式介绍
概述
本章介绍设计模式的概念。
在本章,
l 我讨论设计模式在建筑学中的起源以及它们如何被应用于软件设计的学科中。
l 我讨论学习设计模式的动机。
设计模式是面向对象技术的最前沿部分。面向对象的分析工具、书籍以及研讨会都包含着设计模式。有关设计模式的学习团体比比皆是。通常有着这样的建议,人们只有在掌握了基本的面向对象技能之后才去学习设计模式。我却发现反面才是真的:在学习面向对象技能的初期便学习设计模式,这对提高对面向对象分析和设计的理解大有裨益。
在本书的整个剩余部分,我将不仅仅只讨论设计模式,还会讨论它们是如何展示和巩固面向对象原则的。我希望能提高你对这些原则的理解,并阐明为什么这里讨论的这些设计模式就代表着好的设计。
本章的部分内容看起来或许有些许抽象或者哲学。但是,请给它一个机会!它为你理解设计模式打下基石。对它的理解将会增强你对新模式的理解能力以及和它们相处的能力。
我的很多想法来自Christopher Alexander的《建筑的永恒之路》[1]。我将在整本书中讨论这些想法。
设计模式起源于建筑学和人类学
多年以前,一位名为Christopher Alexander的建筑师问他自己,“质量是客观的吗?”美,真实存在于观看者眼中吗?或者,人们一致同意某些事物是美的而某些事物不美吗?现在,Alexander感兴趣的这种特殊形式的美成为建筑质量的一种:是什么让我们得知何时一个建筑设计才是好的?比如,如果一个人正要为一个房子设计一个入口,他或她怎么知道这个设计是好的?我们能够分辨出好的设计吗?存在一个用作判断的客观根据,一个描述我们一致意见的依据吗?
Alexander假定在建筑体系中存在这样一个客观根据。判断建筑之美不是一个简单的格调问题。我们能够通过一个可测量的客观根据来描述美。
文化人类学的学科发现了同样的东西。其工作主体提出,在什么被认为是一个好的设计,什么是美这一问题上,同一文化内的个体将会赞同大众的意见。文化对好的设计做出超越个人信仰的评判。我相信存在超越的模式,用作评价设计的客观根据。文化人类学的一个主要分支便在寻找模式来描述文化的行为与价值。[2]
设计模式背后的主张便是软件系统的质量也能被客观地度量。
如果你赞同识别并描述一个高质量的设计是有可能的,那么你如何去创造一个这样的设计?我似乎看见Alexander这样问他自己,
什么东西存在于高质量设计之中,却不存在于低质量设计之中?
以及
什么东西存在于低质量设计之中,却不存在于高质量设计之中?
这些问题起源于Alexander的信仰:如果设计中的质量是客观的,那么我们就应该有能力识别出是什么让设计成为好的设计,又是什么让设计成为坏的设计。
通过对建筑、城镇、街道,以及事实上人们为自己建造的每一个其它的生活空间进行大量的观察,Alexander对这个问题进行研究。他发现对于特定的建筑创造,好的结构彼此之间存在着共同的东西。
即便是同样类型的建筑结构,它们也彼此不同。尽管如此,它们依然都可能是高质量的。
例如两个看起来结构上可能不同的走廊,它们都可能被认为是高质量的。它们可能在为不同的房屋解决不同的问题。一个走廊可能是从走道到前门的一个过渡,另一个入口可则能是热天时的一个纳凉之处;或者两个走廊可能在用不同的方式解决一个共同的问题(过渡)。
Alexander明白这点。他知道结构不能脱离它们要解决的问题。因此,在他识别并描述设计质量一致性的探索中,他认识到他必须查看设计于解决相同问题的不同结构。例如图5-1给出了区分一个入口通道问题的两个方案。
图5-1 结构看起来可能不同,但却依然解决一个共同的问题。
Alexander发现通过以这种方式缩小他的焦点——通过查看解决类似问题的结构——他能够辨别出存在于高质量设计之中的相似之处。他称这些相似之处为模式。
他将模式定义为“一个背景下的一个问题的一个解决方案。”
每个模式描述一个在我们的环境中一再出现的问题,接着描述其解决方案的核心,这样你便能将这个方案使用百万次而不需要以同样的方式做两遍。[3]
让我们复习Alexander的一些成果来说明这一点。在表5-1中,我将展示一段来自《建筑的永恒之路》[4]的摘录。这本优秀的著作简洁地介绍了模式的哲学。
表5-1 摘自《建筑的永恒之路》
Alexander说…… |
我的评语…… |
一个形体适宜的庭院,以同样的方式帮助人们在其中生活。 |
一个模式总是拥有一个名称、一个目标。这里,模式的名称是庭院,其目的是帮助人们在其中生活。 |
Consider the forces at work in a courtyard。最主要的是,人们寻求某种私人户外空间,在那里他们可以坐在天空之下看星星、晒太阳,或者养花。这是很明显的。 |
尽管有时这似乎显而易见,但清楚陈述被解决的问题还是很重要的。这是使用模式的首要原因。这便是此处Alexander为庭院所作的事情。 |
但是依然有更微妙的forces。比如,当一个院子用围墙围得太紧,没有向外的视角,人们就会感觉不舒服,并想要离开…他们需要向外看到一些更广阔更遥远的空间。 |
他指出一处使用简化方案的困难,接着,对刚才指出的问题,他给我们一个解决的办法。 |
或者再一次的,人们是习惯的产物。如果他们每天在日常生活中出入这个院子,它将变得日渐熟悉,成为一个自然的去处…这样被使用了。 |
有时候熟悉会阻止我们看到那些显而易见的东西。模式的价值在于,那些缺乏经验的人能够利用其他人在他们之前学得的东西:那些拥有一个优秀设计以及避免拙劣设计所必须包含的。 |
但是一个内部只有一条路的庭院,一个只有当你“想”去你才会去的地方,是一个不熟悉的地方,往往会被弃置不用……人们更多地是去那些熟悉的地方。 |
|
是否有一个过渡的空间——一条走廊或者游廊,在顶盖之下,但却开放于空中——在心理上,这是介于室内和室外之间的一个折中,使得将你带到庭院之中变得容易简单的多…… |
对于建造一个大庭院可能会被忽视的挑战,他建议了一个解决方案。 |
当一个庭院有一个视角,能够对外看到一个更大的空间,有来自不同房间的交叉路,并且拥有一条游廊或者走廊,这些forces就能够解决它们自己。那向外的视角让人舒适,交叉路有助于产生习惯感,走廊让频繁出去变得容易……并且这个庭院逐渐变成一个习惯上舒适的场所。 |
……并且会告诉我们它为什么是强大的。 |
我们来做个复习。Alexander说模式的描述包含四个条款:
l 模式的名字
l 模式的目的,它解决的问题
l 我们如何达到目的
l 为了达到目的我们必须考虑的限制和forces
Alexander假定模式能够解决人们事实上将会遭遇到的每一个建筑问题。他进一步假定模式能被组合使用来解决复杂的建筑问题。
关于模式如何一起工作将会在本书后面被讨论。现在我将聚焦在他关于模式有助于解决特定问题的说法上。
从建筑学模式到软件设计模式
建筑学里所有的这档子事究竟跟我们软件开发人员有何关联呢?
是这样的,20世纪90年代初期一些聪明的开发人员偶然发现Alexander的模式著作,他们想知道在建筑模式上为真的东西是否在软件设计上也为真。[5]
l 是否软件中一再出现的问题也能在某种程度上用同样的方式来解决?
l 是否仅在模式被识别出之后,就有可能通过模式来设计软件,基于它们来创造特定的解决方案?
这些人觉得这两个问题的回答都是“毋庸置疑的正确。”接下来便是去识别几个模式并开发出为新模式分门别类的标准。
虽然很多人在二十世纪九十年代早期就对设计模式产生着影响,但对这一缺乏经验的社区影响最大的书是Gamma,Helm,Johnson和Vlissides的《设计模式:可复用面向对象软件的基捶[6]。为了表彰这四位作者的重要工作,他们被广泛而亲切地冠以四人团的美名。
这本书有几个作用:
l 它将设计模式的想法应用于软件设计。
l 它描述了一个结构,并在这个结构之内分类和描述设计模式。
l 它归类了23个这样的模式。
l 基于这些设计模式,它假定了面向对象的策略和途径。
有一点很重要。这四位作者并没有创造出书中所描述的模式,而是识别出这些模式。因为模式已经存在于软件社区之中,它们反映了人们对特定问题之高质量设计的了解(注意和Alexander的工作的相似)。
今天,有几种描述设计模式的不同形式。由于这不是一本书写设计模式的书,所以我不会给出有关描述设计模式的最好结构的观点。然而,接下来在表5-2中所列举的条款需要被包含在任何的描述之中。
对我在本书中所介绍的每一个模式,我都会用一页来对描述这个模式的关键特性进行总结。
表5-2 模式的关键特性
条款 |
描述 |
名字 |
所有的模式都有一个唯一标示它们的名字。 |
意图 |
模式的目的。 |
问题 |
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: #e0dfe3; BORDER-BOTTOM-COLOR: #e0dfe3; PADDING-BOTTOM: 0cm; WIDTH: 200.9pt; BORDER-TOP-COLOR: #e0dfe3; PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent; mso-border-right-alt: solid windowt