软件设计模式入门

上传人:博****1 文档编号:579214770 上传时间:2024-08-26 格式:PPT 页数:28 大小:3.07MB
返回 下载 相关 举报
软件设计模式入门_第1页
第1页 / 共28页
软件设计模式入门_第2页
第2页 / 共28页
软件设计模式入门_第3页
第3页 / 共28页
软件设计模式入门_第4页
第4页 / 共28页
软件设计模式入门_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《软件设计模式入门》由会员分享,可在线阅读,更多相关《软件设计模式入门(28页珍藏版)》请在金锄头文库上搜索。

1、设计模式导论设计模式导论http:/ 模式与设计模式 描述设计模式 应用设计模式解决问题 选择设计模式 使用设计模式 常用设计模式分析 课程目标课程目标比如要求开发一个绘图程序,用来绘制简单的几何图形。如圆、矩形等,那么在程序中该如何处理这些几何对象呢? 体验项目体验项目 该项目使用该项目使用Simple Factory模式(简单工厂模式)来处理这些几何对象。为模式(简单工厂模式)来处理这些几何对象。为这些几何图形定义一个公共的父类和一些公共的方法,类间的关系如图所这些几何图形定义一个公共的父类和一些公共的方法,类间的关系如图所示:示: Shape是一个抽象类,是一个抽象类,Circle和和R

2、ectangle类是类是Shape的两个具体的两个具体实现,实现,“工厂工厂”类类ShapeFactory用于创建各种几何图形的具体实用于创建各种几何图形的具体实例。例。 Christopher Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需再重复相同的工作。 模式与设计模式模式与设计模式 一般,模式存在如下的基本要素:一般,模式存在如下的基本要素: 名称:每个模式都有一个独一无二的名称,通过名称来鉴别不同的模式。名称:每个模式都有一个独一无二的名称,通过名称来鉴别

3、不同的模式。 问题:模式试图解决的问题。问题:模式试图解决的问题。 解决方案:对于某个情景中的问题,模式提供的解决问题的方法。解决方案:对于某个情景中的问题,模式提供的解决问题的方法。 效果:使用模式后所达到的效果,使用模式的同时研究其约束。效果:使用模式后所达到的效果,使用模式的同时研究其约束。 意图:模式的目的。意图:模式的目的。 参与者和协作者:模式所包含的实体。参与者和协作者:模式所包含的实体。 实现:怎样实现模式。实现是模式的具体表现形式,而不能像模式本身实现:怎样实现模式。实现是模式的具体表现形式,而不能像模式本身那样被分析。那样被分析。 描述设计模式描述设计模式 我们怎样来描述设

4、计模式呢?采用图形概念吗?图形概念固然很重要、很我们怎样来描述设计模式呢?采用图形概念吗?图形概念固然很重要、很有用,但这还远远不够。因为它们仅仅简单的表达了类和对象之间的关系,有用,但这还远远不够。因为它们仅仅简单的表达了类和对象之间的关系,这是设计过程的最终产品。为了设计重用,我们还必须记录决策过程、替这是设计过程的最终产品。为了设计重用,我们还必须记录决策过程、替代方案等。代方案等。 一般我们用统一的格式来描述设计模式,每一种模式都按以下的模版分成一般我们用统一的格式来描述设计模式,每一种模式都按以下的模版分成多个部分。每个部分的模版使用统一的信息结构,便于设计模式的学习、多个部分。每个

5、部分的模版使用统一的信息结构,便于设计模式的学习、比较和使用。比较和使用。 常用的描述模式的格式大致可分为以下部分:常用的描述模式的格式大致可分为以下部分: 模式名和分类(模式名和分类(Pattern Name and Classification):模式名简洁的表):模式名简洁的表达了模式的本质。好的命名非常重要,因为它将会成为你的部分设计达了模式的本质。好的命名非常重要,因为它将会成为你的部分设计术语(词汇)。术语(词汇)。 意图(意图(Intent):主要描述设计模式的作用?其基本原理和目的是什么):主要描述设计模式的作用?其基本原理和目的是什么?它针对哪些特殊的设计问题?它针对哪些特殊

6、的设计问题? 别名(别名(Byname):如果某个模式有其它的名称,那么该模版部分就指):如果某个模式有其它的名称,那么该模版部分就指出了该模式的这个名称。出了该模式的这个名称。 动机(动机(Motivation):指出可能存在的设计问题以及怎样使用该模式中):指出可能存在的设计问题以及怎样使用该模式中的类和对象来解决该问题的情景。这个情景能帮助你理解对该模式更高的类和对象来解决该问题的情景。这个情景能帮助你理解对该模式更高层的抽象描述。层的抽象描述。 适用性(适用性(Applicability):指出模式适用于哪些情况?该模式可用于对):指出模式适用于哪些情况?该模式可用于对那些不良的设计进

7、行改进,以及怎么才能识别这种情况?那些不良的设计进行改进,以及怎么才能识别这种情况? 结构(结构(Structure):指出基于对象模型技术():指出基于对象模型技术(OMT)对该模式的图)对该模式的图形表示,以及使用交互图(对象间请求流程的示意图)来表示对象的形表示,以及使用交互图(对象间请求流程的示意图)来表示对象的请求顺序和协作。请求顺序和协作。 参与者(参与者(Participants):指出参与该模式的类和对象以及各自的职责。):指出参与该模式的类和对象以及各自的职责。 协作(协作(Collaboration):指出参与者为了完成各自的职责应该如何协作。):指出参与者为了完成各自的职

8、责应该如何协作。 结果(结果(Consequences):指出模式达成目标的程度、应用该模式的):指出模式达成目标的程度、应用该模式的结果和费用,以及系统结构是否允许你改变其中的某个或某些方面,具结果和费用,以及系统结构是否允许你改变其中的某个或某些方面,具体是哪些方面?体是哪些方面? 实现(实现(Implementation):指出在实现该模式时,应当具备的前提和):指出在实现该模式时,应当具备的前提和技术,以及该模式有什么缺陷?是否具有与语言无关的特性?技术,以及该模式有什么缺陷?是否具有与语言无关的特性? 例程例程(Sample Code):指出如何使用编程语言来实现该模式。:指出如何使

9、用编程语言来实现该模式。 已知应用(已知应用(Known Uses):指出实际系统中已经使用了该模式的例子,):指出实际系统中已经使用了该模式的例子,一般至少包括两个不同领域的例子。一般至少包括两个不同领域的例子。 相关模式(相关模式(Related Patterns):指出哪些设计模式与该模式紧密相关):指出哪些设计模式与该模式紧密相关?有什么重要的不同?以及该模式应当与哪个或哪些模式一起应用。?有什么重要的不同?以及该模式应当与哪个或哪些模式一起应用。 对于面向对象设计者经常遇到的一些问题,设计模式可采用多种方法来解决,比如对变化性的封装就是许多设计模式的主题,以下列举了这些问题中的几种。

10、 应用设计模式解决问题应用设计模式解决问题 寻找合适的对象寻找合适的对象 指定对象的接口指定对象的接口 描述对象的实现描述对象的实现 运行时刻和编译时刻的结构运行时刻和编译时刻的结构 决定对象的粒度决定对象的粒度 运用复用机制运用复用机制 设计应支持变化设计应支持变化 设计模式可以确保系统能以特定的方式设计模式可以确保系统能以特定的方式变化,从而避免重新设计。变化,从而避免重新设计。 面向对象程序由对象组成,对象包含数据和方法。对象的内部数据和方法是被封装的,不能被直接访问,它的表示对于对象外部是不可见的,客户只能通过对象的请求执行相应的操作。 寻找合适的对象寻找合适的对象 面向对象设计最困难

11、的部分是将系统分解成对象集合。因为在分解的同时需要考虑许多因素:封装、粒度、依赖关系、灵活性、性能、演化、复用等等,它们都影响着系统的分解,并且这些因素通常还是互相冲突的。而许多对象都来源于现实世界的分析模型,但是所得到的类通常在现实世界中并不存在。此时设计模式就能确定那些并不明显的抽象和描述这些抽象的对象。对象在大小和数目上变化极大,能表示任何事物,那么我们怎么来确定一个对象呢?设计模式能很好的处理这个问题。 决定对象的粒度与指定对象的接口决定对象的粒度与指定对象的接口 指定对象的接口指定对象的接口 决定对象的粒度决定对象的粒度 对象接口描述了该对象所能接受的全部请求的集合,任何匹配对象接口

12、对象接口描述了该对象所能接受的全部请求的集合,任何匹配对象接口的请求都可以发送给该对象。对象只有通过它们的接口才能与外部交流,的请求都可以发送给该对象。对象只有通过它们的接口才能与外部交流,如果不通过对象的接口就无法知道对象的任何情况,也无法请求对象做如果不通过对象的接口就无法知道对象的任何情况,也无法请求对象做任何事情。设计模式就能通过确定接口的主要组成成分以及经接口发送任何事情。设计模式就能通过确定接口的主要组成成分以及经接口发送的数据类型,来定义接口。而且设计模式也指定了接口之间的关系。的数据类型,来定义接口。而且设计模式也指定了接口之间的关系。 对象的实现是由它的类决定的,类指定了对象

13、的内部数据和方法,通过实例化类来创建对象,该对象被称为该类的实例。而在很多时候却不将变量声明为某个特定的具体类的实例对象,而是让它遵循抽象类所定义的接口。 描述对象的实现描述对象的实现 抽象类(抽象类(abstract class)的主要目的是为它的子类定义公共接口。一个抽)的主要目的是为它的子类定义公共接口。一个抽象类将把它的部分或全部操作的实现延迟到子类中,因此,一个抽象类不象类将把它的部分或全部操作的实现延迟到子类中,因此,一个抽象类不能被实例化。能被实例化。 而当不得不在某个地方实例化具体的类时,设计模式就可以帮你,通过抽而当不得不在某个地方实例化具体的类时,设计模式就可以帮你,通过抽

14、象对象的创建过程,在实例化时建立接口和实现的透明连接。象对象的创建过程,在实例化时建立接口和实现的透明连接。 运用复用机制运用复用机制 复用技术主要有:复用技术主要有:类继承类继承委托委托 参数化类型参数化类型 对象组合对象组合面向对象系统中功能复用的两种最常用技术是类继承和对象组合面向对象系统中功能复用的两种最常用技术是类继承和对象组合(object composition)。委托(委托(delegation)是一种组合方法,它使组合具有与继承同样的复用能力。)是一种组合方法,它使组合具有与继承同样的复用能力。 参数化类型参数化类型( parameterized type )是一种不常用到的

15、复用技术是一种不常用到的复用技术 类继承和对象组合类继承和对象组合 类继承是在编译时刻静态定义的,且可直接使用,可以较方便地改变被复类继承是在编译时刻静态定义的,且可直接使用,可以较方便地改变被复用的实现。但是继承在编译时就已经定义了,所以无法在运行时改变从父用的实现。但是继承在编译时就已经定义了,所以无法在运行时改变从父类继承的实现,更糟的是,父类通常至少定义了部分子类的具体表示。因类继承的实现,更糟的是,父类通常至少定义了部分子类的具体表示。因为继承对子类揭示了其父类的实现细节,所以继承常被认为为继承对子类揭示了其父类的实现细节,所以继承常被认为“破坏了封装破坏了封装性性”。对象组合是通过

16、获得对其他对象的引用而在运行时刻动态定义的。组合对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。组合要求对象遵守彼此的接口约定,进而要求更仔细地定义接口,而这些接要求对象遵守彼此的接口约定,进而要求更仔细地定义接口,而这些接口并不妨碍你将一个对象和其他对象一起使用。口并不妨碍你将一个对象和其他对象一起使用。 对象组合对系统设计还有另一个作用,即优先使用对象组合有助于你保持对象组合对系统设计还有另一个作用,即优先使用对象组合有助于你保持每个类被封装,并被集中在单个任务上。每个类被封装,并被集中在单个任务上。 一般在实际中应该优先使用对象组合,而不是类继承。一般在实际中应该优先使用对象组

17、合,而不是类继承。 委托委托 委托(委托(delegation)是一种组合方法,它使组合具有与继承同样的复用)是一种组合方法,它使组合具有与继承同样的复用能力。在委托方式下,有两个对象参与处理一个请求,接受请求的对象能力。在委托方式下,有两个对象参与处理一个请求,接受请求的对象将操作委托给它的代理者(将操作委托给它的代理者(delegate)。)。 比如可以在类比如可以在类A中保存一个类中保存一个类B的实例来代理类的实例来代理类B的特定操作,这样类的特定操作,这样类A可以复用类可以复用类B的操作,而不必像类继承那样定义成类的操作,而不必像类继承那样定义成类B的子类。的子类。 委托的主要优点在于

18、它便于运行时刻组合对象操作以及改变这些操作的委托的主要优点在于它便于运行时刻组合对象操作以及改变这些操作的组合方式。有些设计模式使用了委托,通过改变委托对象来改变委托对组合方式。有些设计模式使用了委托,通过改变委托对象来改变委托对象的行为。象的行为。 注意:委托是对象组合技术的一个特例,它使我们了解到对象组合作为注意:委托是对象组合技术的一个特例,它使我们了解到对象组合作为一个代码复用机制也可以替代继承。一个代码复用机制也可以替代继承。参数化类型( parameterized type )也是一种复用技术,它允许在定义一个类型时并不指定该类型所用到的其他所有类型。未经指定的类型在使用时以参数形

19、式提供。 参数化类型参数化类型 对象组合技术允许在运行时刻改变被组合的行为,但是它存在间接性,效对象组合技术允许在运行时刻改变被组合的行为,但是它存在间接性,效率比较低。继承允许提供操作的缺省实现,并通过子类重定义这些操作。率比较低。继承允许提供操作的缺省实现,并通过子类重定义这些操作。参数化类型允许改变类所用到的类型。但是继承和参数化类型都不能在运参数化类型允许改变类所用到的类型。但是继承和参数化类型都不能在运行时刻改变。行时刻改变。聚合意味着一个对象包含另一个对象或者是另一个对象的一部分。聚合对象和其所有者具有相同的生命周期。运行时刻和编译时刻的结构运行时刻和编译时刻的结构 相识(也称为相

20、识(也称为“关联关联”或或“引用引用”)意味着一个对象仅仅知道另一个对象。)意味着一个对象仅仅知道另一个对象。相识的对象可能请求彼此的操作,但是它们不为对方负责。相识是一种比相识的对象可能请求彼此的操作,但是它们不为对方负责。相识是一种比聚合要弱的关系。聚合要弱的关系。 是聚合还是相识是由设计者的意图决定的,而不是由显式的语言机制决定是聚合还是相识是由设计者的意图决定的,而不是由显式的语言机制决定的。他们在编译时刻和运行时刻有很大的区别,程序的编译时刻和运行时的。他们在编译时刻和运行时刻有很大的区别,程序的编译时刻和运行时刻也存在着很大的区别,但代码不能揭示系统工作的全部,而许多设计模刻也存在

21、着很大的区别,但代码不能揭示系统工作的全部,而许多设计模式就能显式的记述编译时刻和运行时刻结构的差别。式就能显式的记述编译时刻和运行时刻结构的差别。 以下是导致重新设计的几个方面:以下是导致重新设计的几个方面: 对硬件和软件平台的依赖对硬件和软件平台的依赖 通过显式地指定一个类来创建对象通过显式地指定一个类来创建对象 对特殊操作的依赖对特殊操作的依赖 算法依赖算法依赖 紧耦合紧耦合 通过生成子类来扩充功能通过生成子类来扩充功能 对对象表示或实现的依赖对对象表示或实现的依赖 不能方便地对类进行修改不能方便地对类进行修改 选择设计模式选择设计模式以下提供几个选择设计模式的参考方法:以下提供几个选择

22、设计模式的参考方法: 研究模式怎样互相关联研究模式怎样互相关联 考虑设计模式怎样解决设计问题考虑设计模式怎样解决设计问题 浏览模式的意图部分浏览模式的意图部分 检查重新设计的原因检查重新设计的原因 考虑你的设计过程中哪些是可变的考虑你的设计过程中哪些是可变的 研究目的相似的模式研究目的相似的模式 使用设计模式使用设计模式 对于设计模式的使用可以从以下几个方面来考虑:对于设计模式的使用可以从以下几个方面来考虑: 查看代码示例部分,分析该模式代码形式的具体例子查看代码示例部分,分析该模式代码形式的具体例子 浏览一遍模式浏览一遍模式 ,比如模式名、意图、适用性、效果等,比如模式名、意图、适用性、效果

23、等 研究结构部分、参与者部分和协作部分研究结构部分、参与者部分和协作部分 定义类,声明它们的接口,建立它们的继承关系,定义代表定义类,声明它们的接口,建立它们的继承关系,定义代表数据和对象引用的实例变量。识别模式会影响到你的应用中数据和对象引用的实例变量。识别模式会影响到你的应用中存在的类,做出相应的修改。存在的类,做出相应的修改。 定义模式中专用于应用的操作名称定义模式中专用于应用的操作名称 选择模式参与者的名字,使它们在应用上下文中有意义选择模式参与者的名字,使它们在应用上下文中有意义 实现执行模式责任和协作的操作实现执行模式责任和协作的操作 常用设计模式分析常用设计模式分析 常用的基本设

24、计模式有常用的基本设计模式有23种,可分为三个类型:种,可分为三个类型: 创建型设计模式创建型设计模式 行为设计模式行为设计模式 结构型设计模式结构型设计模式 描述了实例化对象的相关技术,解决了描述了实例化对象的相关技术,解决了创建对象的有关问题。创建对象的有关问题。 描述了在软件系统中组织类和对象的常用方法,避免了一个描述了在软件系统中组织类和对象的常用方法,避免了一个类被赋予过多职责而破坏类的封装性和信息的隐藏,以及类类被赋予过多职责而破坏类的封装性和信息的隐藏,以及类之间功能重叠的问题。之间功能重叠的问题。 负责分配对象的职责,为对象间协作建负责分配对象的职责,为对象间协作建模提供有效的

25、策略。模提供有效的策略。 创建型设计模式创建型设计模式 Builder模式模式 :将一个复杂的对象构建与它的表示分离开来,使:将一个复杂的对象构建与它的表示分离开来,使用同样的构建过程可以创建不同的表示。用同样的构建过程可以创建不同的表示。 Abstract Factory模式模式 :为创建一系列相关的或者相互依赖的对:为创建一系列相关的或者相互依赖的对象配置接口,而不必指定它们具体的类。象配置接口,而不必指定它们具体的类。 Factory Method模式模式 :定义了一个创建对象的接口,但是却让:定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类。子类来决定具体实例化哪一个类。

26、 Prototype模式模式 :使用原型实例指定创建对象的种类,而通过拷贝:使用原型实例指定创建对象的种类,而通过拷贝这个原型实例来创建新的实例。这个原型实例来创建新的实例。 主要有以下几种:主要有以下几种: Singleton模式模式 :保证在运行的应用程序中,一个:保证在运行的应用程序中,一个Class只实例化一只实例化一次,并提供一个访问它的全局访问点。次,并提供一个访问它的全局访问点。 在创建型模式中除了在创建型模式中除了Factory Method(工厂方法模式)属于类模式,其他都(工厂方法模式)属于类模式,其他都属于对象模式。属于对象模式。结构型设计模式结构型设计模式 Bridge

27、模式模式 :将一个复杂对象的构建与它的表示分离,使得二者可以:将一个复杂对象的构建与它的表示分离,使得二者可以独立变化。独立变化。 Adapter模式模式 :把一个类的接口变换成客户端所期待的另一种接口,:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起使用的两个类能够一起使用从而使原本因接口不匹配而无法一起使用的两个类能够一起使用 。 Composite模式模式 :将对象组织到树结构中,可以用来描述整体与部分:将对象组织到树结构中,可以用来描述整体与部分的关系。的关系。Decorator模式模式 :动态给一个对象增加功能,这些功能可以再动态地撤消。:动态给一个对

28、象增加功能,这些功能可以再动态地撤消。主要有以下几种:主要有以下几种: Facade模式模式 :为一个复杂系统提供了一个简单的接口。即提供一个高层:为一个复杂系统提供了一个简单的接口。即提供一个高层次的接口,使得系统更易于使用。次的接口,使得系统更易于使用。 Bridge模式模式 :给某一个对象提供一个代理对象,并由代理对象控制对:给某一个对象提供一个代理对象,并由代理对象控制对原来对象的引用。原来对象的引用。 Flyweight模式模式 :创建共享对象的一个小型池,以共享的方式高效的支:创建共享对象的一个小型池,以共享的方式高效的支持大量的细粒度对象。持大量的细粒度对象。 在结构型模式中除了

29、适配器(类在结构型模式中除了适配器(类Adapter)属于类模式,其他都属于对象)属于类模式,其他都属于对象模式。模式。 行为设计模式行为设计模式Command模式:把一个请求或者操作封装到一个对象中,允许请求的模式:把一个请求或者操作封装到一个对象中,允许请求的一方和发送的一方独立开来。一方和发送的一方独立开来。 Chain of Responsibility模式模式 :将很多对象连接起来形成一条链。请求:将很多对象连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求为止。在这个链上传递,直到链上的某一个对象决定处理此请求为止。 Interpreter模式模式 :给定一

30、个语言后,该模式可以定义出其文法的一种:给定一个语言后,该模式可以定义出其文法的一种表示,并同时提供一个解释器。表示,并同时提供一个解释器。 Iterator模式模式 :分离一个集合对象的遍历行为,抽象出一个迭代器类来:分离一个集合对象的遍历行为,抽象出一个迭代器类来负责。负责。主要有以下几种:主要有以下几种: Mediator模式模式 :用一个中介对象来封装一系列的对象交互,使得这些对:用一个中介对象来封装一系列的对象交互,使得这些对象不必相互明显作用。从而使它们可以松散耦合象不必相互明显作用。从而使它们可以松散耦合 。在结构型模式中除了解释器(在结构型模式中除了解释器(Interprete

31、r)模板方法()模板方法(Template Method)属于类模式,其他都属于对象模式。属于类模式,其他都属于对象模式。 Observer模式模式 :定义了一种一对多的依赖关系,让多个观察者对象同:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。时监听某一个主题对象。 Memento模式模式 :在不破坏封装的前提下,捕获一个对象的内部状态,:在不破坏封装的前提下,捕获一个对象的内部状态,并外部化,存储起来。并外部化,存储起来。State模式模式 :允许一个对象在其内部状态改变时,改变行为。:允许一个对象在其内部状态改变时,改变行为。 Strategy模式模式 :针对一组算

32、法,将每一个算法封装到具有共同接口的独:针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。立的类中,从而使得它们可以相互替换。 Template Method模式模式 :为一系列的算法先制定一个顶级算法框架,而:为一系列的算法先制定一个顶级算法框架,而将算法的细节留给具体的子类去实现。将算法的细节留给具体的子类去实现。 Visitor模式模式 :封装一些作用于某种数据结构元素之上的操作。一旦这些:封装一些作用于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。操作需要修改的话,接受这个操作的数据结构可以保持不变。 程序的实现要求如下:(1)了解Simple Factory模式。(2)使用Simple Factory模式处理几何对象。实践项目实践项目 模式与设计模式 描述设计模式 应用设计模式解决问题 选择设计模式 使用设计模式 常用设计模式分析 本章总结本章总结

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号