14.3 GOF设计模式及其应用
设计模式的定义为:模式是在一个上下文中,对一个问题的解决方案,GOF提出了模式的4要素,既模式名称、问题解决方案和效果
(1)模式名称(Pattern Name)
一个助记词,使用一两个描述模式问题,解决方案和效果。设计模式允许在较高抽象层次上进行设计,增添了设计词汇,可在书写文档时使用模式名
(2)问题(Problem)
描述了模式使用的场合和条件,描述设计的特定问题,解释设计问题存在的原因,描述导致不灵活设计的类或对象结构,有时还包含了模式应用必须满足的一系列先决条件。
(3)解决方案(Solution)
描述了设计的组成部分,之间的相互关系及各自的职责和协作方式,由于模式像一个模板,可应用于多种不同场合,因此解决方案并不描述一个特定而具体的设计或实现,而提供设计问题的抽象,描述如何使用一个具体或一般意义的元素组合(对象类或组合)来解决这个问题。
(4)效果(Consequences)
描述了模式应用的效果及使用模式应权衡的问题,软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题,模式效果包括它对系统的灵活性,扩充性或移植性的影响。
1、设计模式的描述
在《设计模式:可重用的面向对象软件基础》书中GOF将每一个模式根据一定的模板分成若干部分具体如下:
(1)模式名和分类:模式各简洁地描述了模式的本质,如名字非常重用,它将成为设计词汇表的一部分。
(2)意图:回答“设计模式是做什么的”它的基本原理和意图是什么?它解决的是什么样的特定设计问题?
(3)别名:模式的其他名字
(4)动机:用于说明一个设计问题及如何用模式的类对象来解决问题的特定情景
(5)使用性:什么情况下可以使用该设计模式?该模式可以用来改进那些不良设计?你怎样识别这些情况?
(6)结构:采用基于对象建模技术的表示法对模式中的类进行图形描述
(7)参与者:指设计模式中的类和/或对象,以及它们各自的职责
(8)协作:模式的参与者怎样协作以实现它们的职责
(9)效果:模式怎样支持它的目标?使用模式的效果和所需做的权衡取舍,系统结构的那些方面可以独立改变?
(10)实现:实现模式时需要知道的一些提示,技术要点及应避免的缺陷以及是否存在某些特定于实现语言的问题。
(11)代码示例:用来说明怎样用C++实现该模式的代码片段
(12)已知应用:实际系统中发现模式的例子
(13)相关模式:与该模式紧密相关的模式有哪些?期间重要的不同之处是什么?这个模式应与哪些其他模式一起使用?
2、设计模式的角色
(1)复用现有的高质量的,针对常见的重复出现问题的解决方案。
(2)建立通用的术语以改善团队内部的沟通
(3)将思考转移到更高的视角
(4)判断是否拥有正确的设计,而不仅仅是一个可以工作的设计
(5)改善跟人学习和团队学问
(6)改善代码的可修改性
(7)促进对改良设计的选用,甚至在没有明确使用模式的时候也可以这么做
(8)发现“庞大的继承体系”的代替方案
3、GOF给出的“使用设计模式的循序渐进的方法”
(1)大致浏览一遍模式
(2)研究结构部分,参与者部分和协作部分
(3)看代码示例部分
(4)选择模式参与者的名字,使它们在应用上下文中有意义
(5)定义类
(6)定义模式中专用于应用的操作名称
(7)实现执行模式中责任和协作的操作
14.3.1GOF设计模式的组成及其分类
在GOF设计模式的经典著作中,分类整理了23个基本的设计模式,根据每个模式的用途,这些设计模式被分为3类。
(1)创建型模式(Creational Pattern)处理新对象的创建过程
(2)构造型模式(Strultura Pattern)处理对象和类的组成
(3)行为模式(Behavioral Pattern)详细说明对象或类之间的如何交互及如何分配职责
GOF的23种设计模式的分类参见表14.2
(1)创建性模式:抽象了创建对象的过程,使用系统不依赖于系统中对象是如何创建的,组合和表示的,创建型模型包括:工厂方法(Factory Method)抽象工厂(Abst ract factory)生成器(Builder)原型(Prototype)单件(Sing leton)
(2)结构性模式主要描述如何组合类和对象,以获得更大的结构,结构型模式包括适配器(Adapter),桥梁(Bridge)组成(Composite)装饰(Decoator)刻面(Facade)享元(Flyweight)代理(Droxy)
(3)行为模型:主要描述算法和对象间责任的分配主要考虑对象或类之间的通信模式,行为模式包括:职责链(Chain of Respon sibility)命令(Command)解释器(Inter preter)迭代器(Iterator)中介者(Media torl)备忘录(Memento)观察者(Observer)状态(State)策略(Strategy)模板方法(Tem plate)访问者(Visitor)
由表14.1种知Adapter这个设计模式既可以作用域类,也可以作用域对象,实际上Adapter设计模式有两种使用方式,一是通过类之间的多重继承(类Adapter设计模式)另一种是通过组合形式(对象Adapter设计模式)
14.3创建性GOF设计模式应用实例
1、抽象工厂(Abst ract factory)
(1)意图:抽象工厂设计模式属于对象创建设计模式,目的是给客户程序提供一个创建一系列相关或相互依赖的对象的接口,无需在客户程序中指定要具体使用的类,之所以取这个名字是把类比作工厂,它能不断地制造产品,每个工厂会制造出和该工厂相关的一些列产品,只是各个产品在外观和行为方面不一样。
(2)结构:Abstract Factory 设计模式的一般结构图14.2所示
(3) Abstract Factory 设计模式的特点
①Client只通过抽象产品,操作产品对象、产品对象的具体名字不出现在Client
②在应用系统中增加或删除具体工厂的种类很容易
③可以保证系统应用在某一时刻只使用一个产品系列
④ Abstract Factory接口中已确定了可以创建的产品集合
(4)在以下情况下当考虑使用抽象工厂模式
①一个系统不应当依赖于产品类实例如何被创建组合和表达的细节,这对于所有形态的过程模式都重要的。
②这个系统有多于一个的产品族,而系统只消费其中某一产品族
③同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体系出来。
④系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现
抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,运用抽象工厂模式的关键点在于应对“多多列对象创建”的需求变化。