设计模式的作用
有软件开发经验的朋友应该有这样的体会:构建一个优秀的系统最困难之处不在于编码(coding),而是在早期做出的设计(design)上的决定。设计是软件开发生命周期中的关键阶段,好的设计能产生好的产品,而不当的设计则会影响最终产品的质量。设计的重要性已经深入人心,这从人们热烈讨论和研究设计模式就能看出来。设计模式是拥有多年开发设计经验的人给我们的经验传承,它是作为专家的建议而引入的,它背后的真正威力是其对真实世界的抽象。如果我们没有足够的经验,我们很难做出好的设计,但是富有经验的开发者和设计者以设计模式的形式将他们的经验传授给我们,拥有了这些经验之后,我们也能做出好的设计来了。不仅如此,设计模式还提高了我们软件复用的水平,从而提高了生产效率。
模式的简史和分类
软件设计模式的思想从建筑领域(Christopher Alexander)进化而来。Kent Beck 和 Ward Cunningham将Christopher Alexander的思想应用到软件领域,他们记下了最初的一些模式(UI方面的);第一个发表的关于在开发中使用模式的著述是Erich Gamma于1991年发表的一篇论文;而最著名的GOF的设计模式(1995)了。
依照开发阶段,模式可以被分类为分析模式(analysis patterns)、架构模式(architecture patterns)、设计模式(design patterns)和Idiom:
1、 分析模式——分析包括透过需求的表面去了解本质问题。分析模式就是业务模型中的一组表达了通用基础结构的概念。
2、 架构模式——架构模式表达了软件系统的基础结构组织模型。它提供了一套预先确定的子系统和组件,说明了其职责,还包括为组织它们之间的关系而规定的规则和指导原则。
3、 设计模式——一个设计模式提供了一个模型,此模型提炼了一个软件系统的子系统或组件。它描述了一个通用的可复用的组件,此组件解决了某特定上下文的一般性的设计问题。
4、 Idiom——对某个语言特有的一个低级别的模式。比如某些模式只能使用多继承的语言表达(c++)。
模式的使用现状
现有的讨论设计模式的书籍著作大多都是介绍和记录设计模式的,而很少有论及如何在开发新的应用时系统地应用这些可复用的设计。
可以将在应用中使用设计模式分为两个等级:
1、 偶尔用用。
2、 系统地使用。系统地使用设计模式超出了只是使用某个特定的模式,它可以被分为:
A、 模式语言(Pattern Languages)。一个模式语言提供了能解决特定领域问题的一系列模式。它不仅提供了设计模式本身,还提供了这些设计模式之间的关系。它们意味着应用此模式语言完全解决特定领域问题的过程。
B、 开发过程(Development processes)。一个系统化的开发过程定义了一个模式组合方法、分析和设计的步骤、设计模型和自动化开发步骤的工具。
系统化的开发过程是唯一能使设计模式成为开发中的惯例(common practice)的方法。为此,我们需要作:
1. 定义合成技术。此技术可以被用来组合设计模式去构造系统。
2. 使用合适的模型语言支持此合成技术。
POAD
在面对一个新的复杂的系统的时候,在我们应用多个设计模式去解决实际问题的时候,会遇到一些挑战:
1、 是什么证明一个模式可以作为一个设计组件?如何为整合其它模式,我们如何定义模式的接口?
2、 我们能从设计模式单独地组合应用吗?很多应用使用一个到多个设计模式。挑战是是否能通过粘合设计模式来构建应用,这些模式如何接口,现有的模式是否够用,以及应该用什么类型的模式。
3、 我们如何应用设计模式系统地开发应用。
而POAD能解决这些问题:POAD——Pattern-Oriented Analysis and Design(面向模式的分析和设计),它使用结构的合成在高层次的设计上粘合(glue)设计模式,它基于这样的前提:在某些设计层次,对于应用于应用的设计模式有足够的认识,并且设计者不会受制于模式的内部设计细节。POAD提供逻辑视图去表达作为模式组合的应用设计,还提供必须的方法去跟踪这些模式的参与者到应用的最终类图里面。POAD的用途包括:
1、 促进基于模式的开发。
2、 改进系统化的方法去粘合(glue)模式。
3、 开发设计框架。通过使用模式作为设计积木使得开发设计框架变得容易。
4、 提高设计质量。
总体来说,POAD使用UML作为建模语言,定义了一个设计方法论,它把模式当作设计中的building blocks或者component,认为模式具有在设计层次被组合的能力。POAD定义了一个特别的模式类型称为构造型设计模式(constructional design patterns),并且定义了多个层次的抽象和逻辑视图。POAD还定义了这些层次是如何按照类(class)被追踪到低层次的设计。
在这里有一个重要的术语“角色(Role)”,角色图(Role Diagram)被用来记载设计模式的行为。基于角色的方法认为一个模式为一个角色的协作。一个角色是一个特定的行为,此行为作为和其它角色的协作的结果而定义。一个设计模式捕捉了一个能用一组交互的角色模型化的行为。为了组合模式,每个模式都被描绘称为一个角色图。通常我们见到的描述模式的是类图,而用角色图描述模式的时候,则将其进行了更高的抽象,比如对于抽象工厂模式,在角色图中表示为:工厂角色和产品角色。角色模型的好处在于提供了比类图更高级的抽象,它抽象了模式背后的主要思想。从而通过角色模型可以组合模式:
1、 将所有现有的模式使用角色图建模。
2、 The design uses a prototypical pattern application to derive the composite design pattern. A prototypical application is a concrete application, which is usually represented by an object diagram. It plays the role of the concrete example to be abstracted.
3、 使用应用的协作图来选择可以被该应用使用的模式。使用每个模式的角色图,在应用对象图中把角色从角色图中分配给对象。最后,每个对象都被赋予几个来自几个模式的角色。
4、 使用带有注解过的角色的对象图,设计者创建一个角色关系矩阵。The role relationship matrix is used to analyze how roles are close to each other in terms of the composition constraints. The purpose of this analysis is to discover the pattern interaction synergy and unleash any composite roles. As a result, role equivalent sets that form composite roles are defined. The role relationship matrix is reduced to a final role relationship matrix.
5、 最终的角色关系矩阵被用来为组合设计模式创建角色图(the role diagram for the composite design pattern.)。
之所以介绍POAD给大家,是因为总是看到各位讨论某个具体的设计模式,而对组合多个设计模式以构建优良架构的系统则较少论及。以后的随笔中将进一步和各位讨论POAD。