设计模式的作用

构建一个优秀的系统最困难之处不在于编码(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。

    模式(分析模式、架构模式和设计模式)是我们广泛讨论的一个话题,研究它是为了能提高软件复用(代码复用和设计复用)的水平。模式的发展和OO 语言的发展、OOAD方法论的发展以及UML的发展都密切相关。

    在20世纪60~70年代,面向对象语言初步发展的时期,Alan Kay(Smalltalk的发明人)提出了object-oriented programming,但是OOAD理论还没有正式被提出来。直到1982年Grady Booch发表了OOAD发展史上里程碑式的一篇论文《Object-Oriented Design》。在20世纪80年代,OOAD的先驱者纷纷提出其OOAD idea,比较著名的有Kent Beck, Peter Coad,Don Firesmith,Ivar Jacobson (a UML founder),Steve Mellor,Bertrand Meyer, Jim Rumbaugh (a UML founder),Rebecca Wirfs-Brock等。

    在过去的二十多年里,几种面向对象的分析和设计(OOAD)的方法论被提出来。这些方法论在几个方面有所不同。它们处理域空间(domain space)和创建分析设计模型的方式不同;它们创建的用来捕捉分析设计过程的输出的模型的类型也不同。在这些技术中,比较有名的是:

    1. Shlaer and Mellor (1988) 方法。
    2. Coad and Yourdon (1990) 方法。
    3. Wirfs-Brock、 Wilkerson、 Wiener (1990) 方法。
    4. Jacobson’s Objectory方法。
    5. Booch (1994)方法。
    6. Rumbaugh (1992) 方法。
    7. Hierarchical Object-oriented Design (HOOD) 方法。
    8. Real-Time Object-oriented Modeling language方法。
    9. Catalysis(1998)方法。

    一门设计方法论(design methodology),一般来说包括三个方面:

    1、 Technology aspects(技术方面)。包括概念、符号和模型。可视化的模型表达了设计者解决问题的思想(模式)。
    2、 Process aspects(过程方面)。包括任务和步骤。
    3、 Organizational aspects(组织方面)。企业如何组织,以将方法论行之有效。

    上面的这些理论从提出到现在都有10多年了,在它们的发展过程中,UML集各家所长,最后成为主流的建模语言,而模式也逐渐成为一个热门的研究课题。但是大多数关于设计模式的书籍著述大多都是介绍和记录设计模式的,而很少有论及如何在开发新的应用时系统地应用这些可复用的设计。

    如何科学地使用模式以提高软件复用的水平?如何将多个模式科学地组合起来使用?如何系统地使用模式?为了解决这些问题,又有新的方法论被提出来,这就是 POAD——Pattern-Oriented Analysis and Design(面向模式的分析和设计),相信已经有人对此有了研究,在下篇随笔中,我也将把学习POAD的一些学习笔记贴出来和各位交流。

http://cjwxd126715.javaeye.com/blog/351030

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值