C++(设计模式):01---什么是设计模式、怎样描述设计模式

一、什么是设计模式

  • 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相 关的对象,以适当的粒度将它们归类,再定义类的接口和继承层次,建立对象之间的基本关 系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。 你也希望避免重复设计或尽可能少做重复设计。有经验的面向对象设计者会告诉你,要一下 子就得到复用性和灵活性好的设计,即使不是不可能的至少也是非常困难的。一个设计在最 终完成之前常要被复用好几次,而且每一次都有所修改
  • 有经验的面向对象设计者的确能做出良好的设计,而新手则面对众多选择无从下手,总是求助于以前使用过的非面向对象技术。新手需要花费较长时间领会良好的面向对象设计是 怎么回事。有经验的设计者显然知道一些新手所不知道的东西,这又是什么呢?
  • 内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用过的解 决方案。当找到一个好的解决方案,他们会一遍又一遍地使用。这些经验是他们成为内行的 部分原因。因此,你会在许多面向对象系统中看到类和相互通信的对象(的重复模式。这些模式解决特定的设计问题,使面向对象设计更灵活、优雅,最终复 用性更好。它们帮助设计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案。 一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中
  • 设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述 成设计模式也会使新系统开发者更加容易理解其设计思路。设计模式帮助你做出有利于系统 复用的选择,避免设计损害了系统复用性。通过提供一个显式类和对象作用关系以及它们之 间潜在联系的说明规范,设计模式甚至能够提高已有系统的文档管理和系统维护的有效性。 简而言之,设计模式可以帮助设计者更快更好地完成系统设计
  • 一个设计模式命名、抽象和确定了一个通用设计结构的主要方面,这些设计结构能被用来构造可复用的面向对象设计。设计模式确定了所包含的类和实例,它们的角色、协作方式以及职责分配。每一个设计模式都集中于一个特定的面向对象设计问题或设计要点,描述了什么时候使用它,在另一些设计约束条件下是否还能使用,以及使用的效果和如何取舍
  • 虽然设计模式描述的是面向对象设计,但它们都基于实际的解决方案,这些方案的实现语言是Smalltalk和C + +等主流面向对象编程语言,而不是过程式语言 (Pascal、C、Ada )或更具动态特性的面向对象语言(CLOS、Dylan、Self)

二、设计模式的四个基本要素

  • 模式名称(pattern name) 一个助记名,它用一两个词来描述模式的问题、解决方案 和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上 进行设计。基于一个模式词汇表,我们自己以及同事之间就可以讨论模式并在编写文档时使 用它们。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果。找到恰当 的模式名也是我们设计模式编目工作的难点之一
  • 问题(problem) 描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后 果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设 计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件
  • 解决方案(solution) 描述了设计的组成成分,它们之间的相互关系及各自的职责和协 作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定 而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合 (类或对象组合)来解决这个问题
  • 效果(consequences) 描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述 设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处 具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因 为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植 性的影响,显式地列出这些效果对理解和评价这些模式很有帮助

三、怎么描述设计模式

  • 我们怎样描述设计模式呢?图形符号虽然很重要也很有用,却还远远不够,它们只是将 设计过程的结果简单记录为类和对象之间的关系。为了达到设计复用,我们必须同时记录设 计产生的决定过程、选择过程和权衡过程。具体的例子也是很重要的,它们让你看到实际的设计
  • 我们将用统一的格式描述设计模式,每一个模式根据以下的模板被分成若干部分。模板 具有统一的信息描述结构,有助于你更容易地学习、比较和使用设计模式
  • 模式名和分类:模式名简洁地描述了模式的本质。一个好的名字非常重要,因为它将成为你的设计词汇 表中的一部分
  • 意图:是回答下列问题的简单陈述:设计模式是做什么的?它的基本原理和意图是什么?它解决的是什么样的特定设计问题?
  • 别名:模式的其他名称。
  • 动机:用以说明一个设计问题以及如何用模式中的类、对象来解决该问题的特定情景。该情景 会帮助你理解随后对模式更抽象的描述。
  • 适用性:什么情况下可以使用该设计模式?该模式可用来改进哪些不良设计?你怎样识别这些情 况?
  • 结构:采用基于对象建模技术( O M T)的表示法对模式中的类进行图形描述。我们也 使用了交互图来说明对象之间的请求序列和协作关系
  • 参与者:指设计模式中的类和/或对象以及它们各自的职责。
  • 协作:模式的参与者怎样协作以实现它们的职责。
  • 效果:模式怎样支持它的目标?使用模式的效果和所需做的权衡取舍?系统结构的哪些方面可 以独立改变?
  • 实现:实现模式时需要知道的一些提示、技术要点及应避免的缺陷,以及是否存在某些特定于 实现语言的问题。
  • 代码示例:用来说明怎样用C + +或S m a l l t a l k实现该模式的代码片段。
  • 已知应用:实际系统中发现的模式的例子。每个模式至少包括了两个不同领域的实例。
  • 相关模式:与这个模式紧密相关的模式有哪些?其间重要的不同之处是什么?这个模式应与哪些其 他模式一起使用?

你可能感兴趣的:(C++(设计模式))