71第5章对于设计模式的介绍5.1概述(本章内容)本章将介绍设计模式的概念。在本章中,我将l讨论设计模式在建筑学中的起源,以及它们如何适应软件设计的要求。l讨论学习设计模式的动机。(设计模式和面向对象设计互为补充)设计模式是面向对象技术的“刀刃”部分。面向对象分析工具、书籍、以及讲座都结合了设计模式。关于设计模式的学习组到处都有。人们常常听到这样的建议:只有在掌握了基本面向对象技术之后,才能学习设计模式。但我却发现事实正好相反:在学习面向对象技术的早期学习设计模式,可以大大帮助你提高对面向对象分析、设计的理解。在本书剩下的部分中,我将不仅仅讨论设计模式,还将讨论它们如何展现、补充优秀的面向对象原则。我希望发展你对这些原则的理解,并说明为什么我们讨论的设计模式表现了优秀的设计。(给它一个机会)这些资料看上去可能有些抽象、有些哲学。但请给它一个机会!本章将为你打下对设计模式的理解基础。理解这些资料,可以提高你理解和应用另外的新模式的能力。PDFcreatedwithFinePrintpdfFactorytrialversion中学到了很多思想。我将贯穿本书讨论这些思想。5.2设计模式产生于建筑学和人类学(质量可以客观评价吗?)很多年前,一个名叫ChristopherAlexander的建筑师自问:“质量可以客观评价吗?”美的东西对于观看者都是美的吗?人们是否会同意一些东西是美的而另一些不是?现在,让Alexander感兴趣的一种美就是建筑质量:是什么让我们感觉一个建筑设计是优秀的?比如说,如果有人要为设计一幢房子设计入口,他/她怎么能知道自己的设计是否优秀呢?我们知道哪些设计优秀吗?这样的评价有客观根据吗?对我们共同观点的描述有客观根据吗?Alexander认为建筑学系统中的确存在这样的客观根据。“评价一个建筑物是否美观”并不仅仅是一个品位的问题。我们可以通过可以衡量的客观标准来描述美观程度。文化人类学也显示出同一件事。这门学科指出:各种文化在很大范围内都共同认为“一个优秀的设计一定是美的”。不同文化评价优秀设计的标准已经超越了各自的信仰。我相信,有一些作为评价设计的客观基础的超越性的模式存在。文化人类学的一个分支,就是寻找这些模式来描述一种文化的行为和价值。21Alexander,C.,Ishikawa,S.,Silverstein,M.,TheTimelessWayofBuilding,NewYork:OxfordUniversityPress,1979.2人类学家RuthBenedict是基于模式文化分析的先驱者。这方面的例子,请参见Benedict,R.,TheChrysanthemumandtheSword,Boston:HoughtonMifflin,1946.PDFcreatedwithFinePrintpdfFactorytrialversion设计模式背后的主张,是同样可以客观衡量软件系统的质量。(你怎样反复获得高质量?)如果你接受“优质设计可以识别、描述”的观点,那么你将如何创建一个优质的设计呢?我可以想象Alexander这样问他自己:优质设计能表现而劣质设计不能表现的是什么?以及劣质设计能表现而优质设计不能表现的又是什么?这些问题源自Alexander对于“设计的质量可以客观衡量”的信念。现在我们可以鉴别“是什么让设计优秀”以及“是什么让设计拙劣”。(寻找共同点)为了研究这个问题,Alexander观察了许多建筑物、城镇、街道、以及几乎所有其他模样的人类为自己建造的生活空间。他发现,对于任何特定的建筑物,优秀的结构之间总有一些相同之处。建筑结构彼此之间互不相同,即使它们类型相同。但是,尽管它们互不相同,它们仍然可以都是高质量的。(……特别是需要解决的问题的特点中的共同点)比如说,两个门廊的结构可能看起来不同,但却都可能是非常高质量的。它们可能为不同的房屋解决不同的问题。一个门廊可能是引道和前门之间的过渡。另一个门廊则可能是炎热天气中的荫凉处。或者两个门廊可能用不同的方式解决同一个问题(过渡)。PDFcreatedwithFinePrintpdfFactorytrialversion懂得了这一点。他明白结构可以与它们要解决的问题相分离。因此,在他“鉴别和描述设计质量的一致性”的探索过程中,Alexander认识到,他必须观察被设计以解决同样问题的不同结构。举个例子,图5-1展示了“区分入口(demarkinganentryway)”的问题的两个解决方案。图5-1两个结构可能看上去不一样,但都解决同样的问题。(这引出了模式的概念)Alexander发现,通过这样的方式——观察解决相似问题的不同解决方案——缩小他的关注焦点,他可以洞悉优质设计之间的相似之处。他把这些相似之处称为模式。他把模式定义为“在某一个情景下的问题解决方案”。每个模式,通过一种让你可以无数次使用这一解决方案、而不必再次重复同样工作的方式,描述一个在我们的环境中重复出现的问题、并描述该问题解决方案的核心。33Alexander,C.,Ishikawa,S.,Silverstein,M.,APatternLanguage,NewYork:OxfordUniversityPress,1977,p.x.PDFcreatedwithFinePrintpdfFactorytrialversion描述这些的成果。我将在表5-1中给出他的TheTimelessWayofBuilding4的摘录。这本书简洁的说明了模式的基本原理。表5-1TheTimelessWayofBuilding的摘录Alexander说……我的注释……构造合理的庭院以同样的方式帮助人们在其中生活。一个模式总有一个名称和一个目的。在这里,模式的名称是“庭院”、目的是“帮助人们在其中生活”。请考虑设计庭院时的约束。最最根本的,人们需要的是某种私有的户外空间,在那里他们可以坐在天空下、观赏星辰、享受阳光、可能还要种些花。这是很明显的。尽管有时候看起来很明显,但明确的说明要解决的问题——需要模式的首要理由——仍是很重要的。这就是Alexander在这里为“庭院模式”所做的。但是还有一些细微的约束。比如说,如果一个庭院过于封闭、看不到外面,人们会觉得不舒服而宁可不进去……他们需要能看到更大、更远的地方。他指出了一个用简单的解决方案难以解决的问题,并给我们提供了解决他刚才指出的问题的方法。我们还知道,人是习惯动物。如果他们,在他们平凡生活的每一天,都在这个庭院中进进出出,庭院就会变得熟悉、变成一个让人很自然走去的地方……于是它发挥了作用。但如果一个庭院只是有一条进入的路、只是一个在你“想”去时才去的地方、只是一个不熟悉的地方,那么它就快没用了……人们更频繁的去那些熟悉的地方。对事物的熟悉有时候会阻碍我们看到一些很明显的东西。模式的价值是,那些经验很少的人也可以利用别人在他们之前学到的东西:一个优秀的设计中必须包括什么、以及为了避免做出拙劣的设计必须避免什么。(转下页)4Alexander,C.,Ishikawa,S.,Silverstein,M.,TheTimelessWayofBuilding,NewYork:OxfordUniversityPress,1977.PDFcreatedwithFinePrintpdfFactorytrialversion的摘录(续表)Alexander说……我的注释……或者,直接从外面走进房屋里面当然很唐突……这一点很细微,但它足够影响你进出时的心情。如果有一个过渡空间——一个门廊或一个走廊,上面有覆盖物,但两端敞开——作为心理上的室内到室外的中途部分,它将使你走出房屋、走入庭院的每一小步很容易、更简单……他为建造优秀庭院过程中可能被忽略的一个难题提出了一种建议性的解决方案。如果一个庭院可以向外看到广阔的空间、有通向不同房间的路、并有一个走廊或门廊,这些约束自己就可以解决了。广阔的视野让庭院变得舒适,庭院中的小路帮助人们产生习惯的感觉,门廊则让人们更容易、更经常的走出房屋……渐渐的,这个庭院成了一个人们愉快的、习惯的地方。Alexander告诉我们如何建造一个优秀的庭院…………以及为什么这个庭院是优秀的。(每个模式描述需要的四个组成部分)作为回顾,Alexander说一个模式的说明应该包括四个项目:l模式的名称l模式的目的,它要解决的问题l我们如何实现它l为了实现它我们必须考虑的限制和约束PDFcreatedwithFinePrintpdfFactorytrialversion(模式存在于几乎所有设计问题中)Alexander认为模式可以解决可能遇到的几乎所有建筑学问题。他还更进一步的认为模式可以结合在一起使用,以解决更复杂的建筑学问题。(……并且可以被组合起来解决复杂的问题)本书将在稍晚的时候讨论“模式怎样结合在一起工作”;现在我将把注意力集中在他的“模式可以用于解决特定问题”的主张上。5.3从建筑学转移到软件设计模式这些建筑学材料对我们软件开发者有什么作用?(将Alexander的思想应用于软件)唔,在二十世纪九十年代前期,一些聪明的开发者偶然发现了Alexander关于模式的研究成果。他们想知道对于建筑学模式适用的东西是否对于软件开发也适用。5l软件中是否有不断重复出现、可以用某种相同方式解决的问题?l是否可能用“按照模式、首先识别出模式然后在模式的基础上创建特定的解决方案”的方法来设计软件?这些人感觉到,这两个问题的答案是“毫不含糊的yes”。下一步的工作就是,识别出几个模式,并制定出收录新模式的标准。5欧洲的ESPRIT协会在八十年代就开始进行相似的工作了。ESPRIT的计划1098和计划5248发展出了一种名叫知识分析及设计支持(KADS)的基于模式的设计方法学,其关注焦点是创建专家系统的模式。KarenGardner将KADS中的分析模式扩展到了面向对象领域。详情参见Gardner,K.,CognitivePatterns:Problem-SolvingFrameworksforObjectTechnology,NewYork:CambridgeUniversityPress,1998.PDFcreatedwithFinePrintpdfFactorytrialversion(四人团进行了设计模式的早期工作)尽管在九十年代前期有很多人从事于设计模式的工作,对这个缺乏经验的群体影响最深刻的书却是Gamma、Helm、Johnson和Vlissides的《设计模式:可复用面向对象软件的基础》6。出于对他们重要成果的公认,这四个作者通常被亲切的称为“四人团”。这本书有以下几点重要意义:l它将设计模式的思想应用于软件设计。l它描述了收录和描述设计模式的一个结构。l它收录了23个模式。l它在这些模式的基础上提出了面向对象策略及方法的原则。需要认识到:这几位作者并不是书中这些模式的创建者。实际上,这几位作者识别出了那些已经存在于软件社群中的模式、那些反映出“从特定问题的优质设计中学到的经验”的模式(请注意与Alexander著作中的相似性)。今天,已经有了几种不同的描述设计模式的格式。因为这并不是一本关于编写设计模式的书,所以我不会评价什么是描述模式的最佳结构;但是,任何一个描述都需要包括表5-2中所列的项目。对于我在这本书中展示的每个模式,我将就这些基本要素给出一页篇幅的总结,用以描述这