首页 > 代码库 > 设计模式

设计模式

模式的本质

什么是模式?

  从宿舍或实验室出发,去上课或用餐,我们采用过不同方式去完成这个行为。通过回忆这些方式对比可以发现,当我们刚刚来到一所学校,由于对校园的环境不熟悉采用过不同的路线去到达目的地;随着我们对这所学校的环境的不断熟悉,我们会从中选择一个最合适的路径;后来,我们又利用自行车这种交通工具进一步节省我们在路途上花耗的时间,从刚来的这所学校到我们骑着一辆自行车在校园里溜达可能间隔3周时间。假若某一天你身边来了一位新生,他和你当初一样步行并且经常走冤枉路,你可能会告诉他那条路比较近,骑自行车和使用其他交通工具会比较省时。这位新生可能会采纳你的建议。

  挑选较近的路线使用交通工具来节省时间这对大多数人是可以接受并采纳的方案,并且该方案在不同的人身上不断重复使用,他们更不必花耗几周的时间来考虑这个问题。针对该问题的解决方案可以称为一种模式。那么,所谓的“模式”也就是对问题和解决方案内容的描述,解决方案可以在不同的设置下复用。

模式的特征

  每个模式都是一个由3部分组成的规则,它表达的是某一环境、一个问题以及解决问题的方案之间的关系。作为世界中的元素,每一个模式都是这三者之间的关系:

    1.某一环境

    2.此环境中反复出现的某个因素系统

    3.使这些因素能够自我协调的某种空间配置

  模式表明如何反复使用这个空间配置来解决给定的因素系统,只要这个空间配置在该环境中适用,并且可预见到好的结果。

 

  简而言之,模式是存在于世界中的事物,同时也是告诉我们如何创造这个事物,以及何时必须创造它的规则。它既是过程,又是事物;既描述了有活力的事物,又描述了产生事物的过程。因此,我们可以总结到:

 

 模式 = 问题背景 + 问题  + 解决方案.

 

     通常,当我们去描述一个模式时我们可以从四个个方面进行阐述,分别是:

    1.名字,模式的一个有意义的的指代;

    2.问题域的描述,解释什么时候模式可以应用;

    3.针对问题的解决方案的描述;

    4.结果的陈述,说明该模式的结果和副作用。

 

  模式并非一种详细的描述,我们可以把它当作累积的智慧和经验的描述,是对一般问题的一个经过多次提炼的解决方案。所以,在软件的整个开发过程中都存在着可使用的模式,比如分析模式(荐《分析模式——可复用的对象模型》Martin Fowler著)&设计模式。使用模式可以使一个经验不足的软件人员能像一个经验丰富大师一样去开发设计软件。

设计模式

  对于从设计模式,可以从不同的层面进行讨论,如面向对象设计层面和软件的体系结构层面。首先介绍一下OOA&D

OOA&D

面向对象分析

  面相对象分析阶段主要关注的是研究问题域和用户需求,运用面向对象的观点发现问题域中与系统责任有关的对象,以及对象的特征和相互关系。目标是建立一个直接映射问题域,符合用户需求的OOA模型。

面向对象设计

  面向对象设计阶段是在OOA模型基础上,针对选定的实现平台进行系统设计,按照实现的要求进行具体的设计,目标是产生一个能够在选定的软硬件平台上实现的OOD模型。

MDA下的OOA&D

  • OOA模型:抽象层次较高,忽略了与实现有关的因素。
  • OOD模型:抽象层次较低,包含了与实现平台有关的细节。

  MDA即模型驱动的体系结构,MD是指用模型来对系统的理解、设计、构造、部署、操作、维护和更新进行指导。

图 1-1

  将MDA的观点运用在OOA&OOD上,那么OOA模型只针对问题域和系统责任,不涉及实现条件,因此可得到一个平台无关的OOA模型;OOD模型是在OOA模型基础上针对特定实现条件进行设计转换成一个平台专用的OOD模型。因此可以根据OOA模型在不同的平台上进行设计产生多个版本的OOD模型,所以OOA模型是可以复用的。

  编程方法中的重点主要是正确有效地使用特定的语言机制,而设计方法的重点是正确有效地构造出复杂系统的结构。面向对象分析的重点在于构建真实世界的模型,利用面向对象的观点看世界,从问题域中寻找类和对象对需求进行分析。

面向对象设计模式

   在20世纪90年代初,由Gamma、Helm、Johnson和Vlissides合著的《设计模式:可复用面向对象软件的基础》这部书对设计模式影响深远,为了褒奖他们的重要工作,大家给这四位作者一个昵称—GoF,即“四人组”。GoF在他们的书中从面相对象设计的角度根据面向对象的机制分析类或对象之间的协作关系编录了23个设计模式。这23个设计模式可根据模式的目的分为三类,分别为创建型、结构性和行为性。

设计模式