14
UML
设计
模式
第14章 UML与设计模式,面向对象分析与设计&UML,2,14.1 为什么要使用设计模式,要真正掌握软件设计,必须研究其他软件大师的设计,这些设计包含了许多设计模式(Design Pattern)。设计模式系统地命名、解释和评价了重要的、经常出现的OO系统中的设计。简单地说,设计模式是对某特定环境下某类问题的解决方法。使用设计模式的好处:简化并加快设计;方便设计者之间的通信;降低风险;有助于转到OO技术设计模式突出了面向对象技术中的封装、泛化、多态等概念,学习设计模式,必须清楚这些概念的使用。,面向对象分析与设计&UML,3,14.2 设计模式的历史,20世纪70年代后期,美国伯克利大学建筑学教授Christopher Alexander 提出了设计模式的概念80年代,很多计算机开发人员根据Alexander的思想开始在软件开发中有意识地使用设计模式80年代后期90年代初,Erich Gamma开始对设计模式进行分类整理的工作,并在其博士论文中有详细的论述。1995年,E.Gamma、R.Helm、R.Johnson和J.Vlissides四人(Gang of Four-GoF)合著了经典:”Design Patterns:Elements of Reusable Object-Oriented Software”,面向对象分析与设计&UML,4,14.3 设计模式的分类,GoF的书中设计模式的分类(23个模式),抽象了创建对象的过程,使得系统不依赖于系统中对象是如何创建、组合和表示的。,主要描述如何组合类和对象以获得更大的结构。,主要描述算法和对象间职责的分配。,面向对象分析与设计&UML,5,14.4 设计模式实例 Facade 设计模式,刻面(Facade)设计模式属于对象结构型设计模式。利用Facade设计模式可以为子系统中的一组接口提供一个一致的界面,可以降低系统中各部分之间的相互依赖关系,同时增加了系统的灵活性。,Q,R,S,I,J,K,L,Q,R,S,I,J,K,L,Facade,Client 类,子系统类,面向对象分析与设计&UML,6,14.4 设计模式实例 Facade 设计模式,Facade设计模式的特点:1)对client来说屏蔽了子系统中的类,因此减少了Client需要直接处理的对象,使得子系统更容易被使用;2)降低了Client和子系统之间的耦合度;3)有助于对象之间依赖关系的分层,建立具有层次结构的系统;4)子系统中的类不需要了解关于Client的知识,也不需要了解关于Facade类的知识,即没有指向Client和Facade的引用;5)如果需要,Client也可以直接存取子系统中的类。,面向对象分析与设计&UML,7,14.4 设计模式实例 Facade 设计模式,课本P157说明了如何使用Facade设计模式对数据库进行操作的接口。Facade设计模式的适用场合:1)要为复杂的子系统提供一个简单的接口2)Client和Client要使用的类之间存在过多的依赖关系3)要建立具有层次结构的子系统,面向对象分析与设计&UML,8,14.4 设计模式实例 Abstract Factory设计模式,抽象工厂(Abstract Factory)设计模式属于对象创建型设计模式。使用Abstract Factory设计模式的目的是给客户程序提供一个创建一系列相关或相互依赖的对象的接口,而无需在客户程序中指定要具体使用的类。例:多种图形用户界面的设计(利用3个抽象类),面向对象分析与设计&UML,9,14.4 设计模式实例 Abstract Factory设计模式,Abstract Factory设计模式的特点:1)Client只通过抽象产品操作产品对象,产品对象的具体名字不出现在Client中;2)在应用系统中增加或删除具体工厂的种类很容易;3)可以保证应用系统在某一时刻只使用一个产品系列,如只使用ProductA1、ProductB1系列或只使用ProductA2、ProductB2系列;4)AbstractFactory接口中已确定了可以创建的产品集合,如果要支持新的产品种类,需要扩展AbstractFactory类及其所有子类中的方法,这种修改比较困难。Abstract Factory 的适用场合:1)系统要独立于它的产品的创建、组合和表示;2)可以对系统进行配置,以便系统可以使用多个产品系列中的某一个;3)要求一组相关的产品要一起被使用,并且希望强化这个约束条件;4)希望以类库的形式提供产品,并且只希望展示这些产品的接口,而不是产品的实现。,面向对象分析与设计&UML,10,14.4 设计模式实例 Visitor设计模式,访问者(Vistor)设计模式属于对象行为型设计模式。使用Vistor设计模式的目的是,对一个对象结构中的各个对象进行操作,以便在不改变对象结构中各个对象类的前提下增加作用于这些对象的新操作。例:不采用Vistor设计模式的设计,存在的问题:由于把所有操作都分散到各个结点类中,导致整个系统难以理解和维护。增加一个新的操作将需要对所有的结点类进行修改和重新编译。,面向对象分析与设计&UML,11,14.4 设计模式实例 Visitor设计模式,采用Visitor设计模式的设计,面向对象分析与设计&UML,12,14.4 设计模式实例 Visitor设计模式,Visitor设计模式允许不改变类的定义即可有效地增加其上的操作,实际上是使用了双分派(double-dispatch)技术。双分派指的是一个请求究竟由哪个操作来实现取决于请求的种类和两个接收者的类型,例如,在Visitor设计模式中,accept是一个双分派操作,因为accept的含义取决于两个类型:Visitor类型和Element类型。与双分派技术相对应的是单分派(single-dispatch)技术,单分派指的是一个请求究竟由哪个操作来实现取决于该请求的名字和一个接收者的类型。Visitor设计模式的特点是:1)使得在复杂对象结构上增加新的操作变得容易;2)相关的行为不是分布在各个类上,而是集中在一个访问者(Visitor)中;3)对象结构中各个对象的类型是固定的,增加新的对象类型很困难;4)对象结构中各具体对象(ConcreteElementX)要作为参数递给Visitor对象,在Visitor对象中要对ConcreteElementX的一些内部属性进行操作,因此要求ConcreteElementX提供一些可见性为public的操作,这样就降低了ConcreteElementX的封装性。,面向对象分析与设计&UML,13,14.4 设计模式实例 Visitor设计模式,Visitor设计模式的适用场合:1)一个对象结构包含很多种类型的对象,需要对这些对象实施一些依赖于对象具体类型的操作,而又想避免让这些操作“污染”所有的对象类。2)定义对象结构的类几乎不会改变,但经常需要在此对象结构上定义新的操作。应用Visitor设计模式时要考虑的关键问题是系统的哪个部分会经常变化,是作用于对象结构上的算法(作用于对象上的操作)还是构成该结构的各个对象的类?如果是作用于对象结构上的算法经常变化,则 使用Visitor设计模式效果会比较好,如果是构成该结构的各个对象的类经常变化,则使用Visitor设计模式反而会有不好的效果。,