系统架构设计师学习之路(35)

第7章 设计模式

近年来,在面向对象领域中的一个重要突破就是提出了设计模式的概念。软件的设计模式是人们在长期的开发实践中良好经验的结晶,它提供了一个简单、统一的描述方法,使人们可以复用这些软件设计方法、过程管理经验。由于设计模式在表达上既经济又清楚,从而越来越受到重视。

本章将介绍软件设计模式的概念、组成要素和分类,并介绍了 facade、Adapter、Abstract Factory 等常用设计模式。

7.1 设计模式概述

在任何设计活动中都存在着某些重复遇到的典型问题,不同开发人员对这些问题设
计出不同的解决方案,随着设计经验在实践者之间日益广泛地被利用,描述这些共同问题和解决这些问题的方案就形成了所谓的模式。

7.1.1 设计模式的历史
模式概念是建筑师 Christopher Alexander 提出的,他提出可以把现实中一些已经实
现的较好的建筑和房屋的设计经验作为模式,在以后的设计中直接加以运用。他还定义了一种“模式语言”来描述建筑和城市中的成功的架构。

Christopher Alexander 将模式分为几个部分:首先是特定的情景(Context) , 指模式在何种状况下发生作用;其二是动机(System of Force) , 指问题或预期的目标;其三是解决方案(Solution) , 指平衡各动机或解决所阐述问题的一个构造或配置。他提出模式是表示特定的情景、动机、解决方案三个方面关系的一个规则,每个模式描述了一个在某种特定情景下不断重复发生的问题,以及该问题解决方案的核心所在。模式既是一个事物又是一个过程,不仅描述该事物本身,而且提出了通过怎样的过程来产生该事物。设计模式的核心是问题描述和解决方案,问题描述说明模式的最佳使用场合及它将如何解决问题,解决方案是用一组类和对象及其结构和动态协作来描述的。

20世纪80年代中期由 Ward Cunningham 和 Kent Beck 将其思想引入到软件领域。1995年,E. Gamma, R. Helm, R. Johnson和J. Vlissides4人合著了 Design Patterns; Elements of Object-Oriented Software, 这是软件设计模式领域中的一本经典书籍,从此设计模式成为软件工程领域内的一个重要研究领域,这四人也因此被称为Gang of Four (GoF) , 成为设计模式中的大师级人物。

7.1.2 为什么要使用设计模式
面向对象设计时需要考虑许多因素,例如封装性、粒度大小、依赖关系、灵活性和可重用性等。如何确定系统中类及类之间的关系?如何保证在系统内部的一个类始终只有一个实例被创建?如何动态地将追加的功能增加到一个对象?哪些是设计时要达到的目标?这些都是软件设计中不容易掌握的问题。要真正掌握软件设计,必须研究其他软件设计大师的设计,这些设计中包含了许多设计模式。软件模式的应用对软件开发产生了重大的作用,主要表现在以下几个方面。

  1. 简化并加快设计
    开发人员面对的问题来自不同的层次。在最底层,涉及的是单个类的接口或实现的细节问题;在最高层,涉及的是系统的整体架构的创建问题。设计模式关注的是中间层,在这一层必须保证局部化的特定的设计性质。设计模式使得软件开发人员无须从底层做起,开发人员可以重用成功的设计,可节省开发时间,同时有助于提高软件质量。

  2. 方便开发人员之间的通信
    利用设计模式可以更准确地描述问题及问题的解决方案,使解决方案具有一致性。
    也有利于开发人员可以在更高层次上思考问题和讨论方案。例如,如果所有人都理解Factory 设计模式的意思,则开发人员可以用“建议采用 Factory 设计模式来解决这个问题”这样的话来表达。

  3. 降低风险
    由于设计模式经过很多人的使用,已被证明是有效的解决方法,所以采用设计模式
    可以降低失败的可能性,也有利于在复杂的系统中产生简洁、精巧的设计。

  4. 有助于转到面向对象技术
    新技术要在一个开发机构中得到应用,一般要经历两个阶段,即技术获取阶段和技
    术迁移阶段。技术获取阶段较容易,但在技术迁移阶段,由于开发人员对新技术往往会有抵触或排斥心理,对新技术可能带来的效果持怀疑态度,同时由于对新技术还是一知半解,所以要在一个开发机构中进行技术迁移并不是一件容易的事。设计模式一般都是基于面向对象技术而提出的,也可应用于接口定义良好的结构化方法中。另外,设计模式是可重用的设计经验的总结,已在实际的系统中多次得到成功应用,因此通过对设计模式的研究,能够深入理解良好设计的最基本的性质,从而有助于说服开发人员采用新技术。

成熟的软件设计模式具有以下特性。
(1) 巧妙:设计模式是一些优雅的解决方案,是在大量实践经验的基础上提炼出
来的。
(2) 通用:设计模式通常不依赖于某个特定的系统类型、程序设计语言或应用领域,它们是通用的。
(3)得到很好的证明:设计模式在实际系统和面向对象系统中得到广泛应用,它们
并不仅仅停留在理论上。
(4)简单:设计模式通常都非常简单,只涉及很少的一些类。为了构建更多更复杂
解决方案,可以把不同的设计模式与应用代码结合或混合使用。
(5) 可重用:设计模式的建档方式使它们非常易于使用,因而可方便用于任何适宜的系统。
(6) 面向对象:设计模式是用最基本的面向对象机制如类、对象、多态等构造的。许多模式特别强调了菜些面向对象设计擅长的领域,例如,区分接口和实现、降低各部分之间的依赖性、隔离硬件和软件等。

7.1.3 设计模式的组成元素
模式是一个高度抽象的概念。设计模式的基本组成元素如下。

  1. 模式名
    模式必须具有一个有意义的名称,这样就可以用一个词或短语来指代该模式,以及
    它所描述的知识和结构。模式名称简洁地描述了模式的本质。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果,找到恰当的模式名也是设计模式编目工作的难点之一。

  2. 问题或意图
    陈述问题并描述它的意图,以及它在特定的情景和动机下要达到的目标,它解释了
    设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等,也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。通常情况下这些动机和目标是相互矛盾、相互影响的。

  3. 情景
    情景是问题及其解决方案产生时的前提条件。情景告诉我们该模式的适用性,可以
    将情景视为应用该模式之前的系统初始配置。

  4. 动机
    它描述相关的动机和约束,它们之间或与期望达到的目标之间的相互作用(或冲突),通常需要对各期望的目标进行优先级排序。动机阐明了问题的复杂性,定义了在相互冲突时所采取的各种权衡手段。一个好的模式应尽可能将所有产生影响的动机考虑在内。

  5. 解决方案
    解决方案是描述一些静态的关系和动态的规则,用以描述如何得到所需的结果。通
    常是给出一组指令来说明如何构造所需的工作制品。该说明可包括图表、文字,用以标示模式的结构、参与者及其之间的协作,从而表明问题是如何解决的。因为模式就像一个模板,可应用于多种不同的场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。

  6. 示例
    示例指一个或多个模式的应用例子,示例说明了模式在怎样的初始情景下如何发生作用,如何改变情景而导致结果情景的出现。示例带助该有理解模式的具体使用方法。

  7. 结果情景
    结果情景指在该模式后系统的状态或配置,包括模式发生作用后带来的后果,以及在新的情景下产生的问题、可应用的模式等,它阐述了模式的后续状态和副作用,
    通常通过对结果情景的描述,使该模式与其他模式联系起采(该模式的结果情景成为其他模式的初始情景)。

  8. 基本原理
    基本原理指对该模式中的解决步骤或采用的规则的解样、证明,解释该模式如何、为何能解决当前问题,它采用的方法为何能得到与期望相一致的结果。

  9. 相关模式
    该模式与其他模式的关系,包括静态的和动态的。例如,该模式的前导模式(前导
    模式应用后产生的结果情景与该模式的初始情景一致)、后续模式(该模式应用后产生的结果情景与后续模式的初始情景一致)、替代模式(使用该模式的替代模式产生同样的效果)等。

  10. 已知应用
    阐述该模式在已有应用系统中的实际应用情况,有助于验证该模式的有效性。尽第
    我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。模式效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
    通常好的模式前面都有一个摘要,提供简短的总结和概述,为模式描绘出一个清晰
    的图画,提供有关该模式能够解决问题的快速信息。有时这种描述称为模式缩略概要,或一个缩略图。模式应该说明它的目标读者,以及对读者有哪些知识要求。

7.1.4 设计模式的分类
软件模式主要可分为设计模式、分析模式、组织和过程模式等,每一类又可细分为若于个子类。在此着重介绍设计模式,目前它的使用最为广泛。设计模式主要用于得到简洁灵活的系统设计,GoF 的书中共有23个设计模式,这些模式可以按两个准则来分类:一是按设计模式的目的划分,可分为创建型、结构型和行为型三种模式;二是按设计模式的范围划分,即根据设计模式是作用于类还是作用于对象来划分,可以把设计模式分为类设计模式和对象设计模式。

  1. 创建型模式
    该类型模式是对对象实例化过程的抽象,它通过采用抽象类所定义的接口,封装了系统中对象如何创建、组合等信息。

  2. 结构型模式
    该模式主要用于如何纽合已有的类和对象以获得更大的结构,一般借鉴封装、代理、继承等概念将一个或多个类或对象进行组合、封装,以提供统一的外部视图或新的功能。

  3. 行为型模式
    该类模式主要用于对象之间的职责及其提供的服务的分配,它不仅描述对象或类的
    模式,还描述它们之间的迪信模式,特别是描述一组对等的对象怎样相互协作以完成其中任一对象都无法单独完成的任务。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值