软件设计模式_第1页
软件设计模式_第2页
软件设计模式_第3页
软件设计模式_第4页
软件设计模式_第5页
已阅读5页,还剩99页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件设计模式软件设计模式 哈尔滨华德学院哈尔滨华德学院软件设计模式软件设计模式 第第1 1章设计模式简介章设计模式简介1.1什么是设计模式什么是设计模式v设计模式(设计模式(patternpattern)是从许多优秀的软件系统中)是从许多优秀的软件系统中总结出的成功的可总结出的成功的可复用复用的设计方案。的设计方案。v每一个设计模式描述一个在我们周围不断重复发生每一个设计模式描述一个在我们周围不断重复发生的问题,以及该问题的的问题,以及该问题的解决方案解决方案的核心。的核心。v设计模式是对被用来在特定场景下解决一般设计问设计模式是对被用来在特定场景下解决一般设计问题的题的类和相互通信的对象的描

2、述类和相互通信的对象的描述。v模式体现的是程序模式体现的是程序整体的构思整体的构思,所以有时候它也会,所以有时候它也会出现在分析或者是概要设计阶段出现在分析或者是概要设计阶段 v模式的核心思想是通过增加模式的核心思想是通过增加抽象层抽象层,把变化部分从,把变化部分从那些不变部分里分离出来那些不变部分里分离出来软件工程专业2021-10-2231.1什么是设计模式什么是设计模式v设计模式的四要素设计模式的四要素 模式名称模式名称(Pattern Name)(Pattern Name) 问题问题(Problem)(Problem) 解决方案解决方案(Solution)(Solution) 效果效果

3、(consequences)(consequences)软件工程专业2021-10-2241.2设计模式的起源设计模式的起源 v软件领域的设计模式起源于建筑学。软件领域的设计模式起源于建筑学。 19771977年,建筑大师年,建筑大师AlexanderAlexander出版了出版了A Pattern A Pattern LanguageLanguage:Towns, Building, ConstructionTowns, Building, Construction一书。受一书。受AlexanderAlexander著作的影响著作的影响 ,Kent BeckKent Beck和和Ward C

4、unninghamWard Cunningham在在19871987年举行的一次面向对象的会议上发表了论文:年举行的一次面向对象的会议上发表了论文:在面向对在面向对象编程中使用模式象编程中使用模式。 2021-10-22软件工程专业51.2设计模式的起源设计模式的起源 目前目前,被公认在设计模式领域最具影响力的著作是,被公认在设计模式领域最具影响力的著作是Erich Erich GammaGamma、Richard HelmRichard Helm、Ralph JohnsonRalph Johnson和和John John VlissidesVlissides在在19941994年合作出版的著

5、作:年合作出版的著作:Design PatternsDesign Patterns:Elements of Elements of Reusable Object-Oriented SoftwareReusable Object-Oriented Software(中译本(中译本设计模式设计模式:可复用的面向对象软件的基本原理:可复用的面向对象软件的基本原理 或或设计模式设计模式),),该书被广大喜爱者昵称为该书被广大喜爱者昵称为GOFGOF(Gang of FourGang of Four)之书,被认为)之书,被认为是学习设计模式的必读著作,是学习设计模式的必读著作,GOFGOF之书已经被公

6、认为是设计模之书已经被公认为是设计模式领域的奠基之作。式领域的奠基之作。2021-10-22软件工程专业61.3设计模式的分类设计模式的分类v设计模式分为三种类型,共设计模式分为三种类型,共2323种。种。 创建型模式:单例模式、抽象工厂模式、建造者创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。模式、工厂模式、原型模式。 结构型模式:适配器模式、桥接模式、装饰模式结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。、组合模式、外观模式、享元模式、代理模式。 行为型模式:模版方法模式、命令模式、迭代器行为型模式:模版方法模式、命令模式、迭代器

7、模式、观察者模式、中介者模式、备忘录模式、模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式解释器模式、状态模式、策略模式、职责链模式、访问者模式。、访问者模式。2021-10-22软件工程专业71.4什么是框架什么是框架v框架通常定义了应用体系的整体结构类和对象的关框架通常定义了应用体系的整体结构类和对象的关系等等设计参数,以便于具体应用实现者能集中精系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特定细节。力于应用本身的特定细节。v框架主要记录软件应用中共同的设计决策,框架强框架主要记录软件应用中共同的设计决策,框架强调设计复用,因此框架设计中必

8、然要使用设计模式调设计复用,因此框架设计中必然要使用设计模式v设计模式有助于对框架结构的理解,成熟的框架通设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设计模式常使用了多种设计模式, ,如果你熟悉这些设计模式如果你熟悉这些设计模式2021-10-22软件工程专业8软件设计模式软件设计模式 第第2 2章面向对象的几个基本原则章面向对象的几个基本原则2.1面向抽象原则面向抽象原则v设计一个类时,不让该类面向具体的类,而是面向设计一个类时,不让该类面向具体的类,而是面向抽象类或接口抽象类或接口 。v包含抽象方法的类称为抽象类,在面向对象的程序包含抽象方法的类称为抽象类,在面向对象的程序设计

9、思想中,抽象类只能做为父类使用,不能被实设计思想中,抽象类只能做为父类使用,不能被实例化为对象。例化为对象。vJavaJava里面由于不允许多重继承,所以如果要实现多里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。个类的功能,则可以通过实现多个接口来实现。2021-10-22软件工程专业102.2开开-闭原则闭原则 v设计应当对扩展开放,对修改关闭。设计应当对扩展开放,对修改关闭。 v模块应尽量在不修改原代码的情况下进行扩展。模块应尽量在不修改原代码的情况下进行扩展。v可以在软件完成后对软件进行扩展,加入新的功能可以在软件完成后对软件进行扩展,加入新的功能。这

10、样,软件就可通过不断的增加新模块满足不断。这样,软件就可通过不断的增加新模块满足不断变化的新需求。变化的新需求。v由于不修改软件原来的模块,不用担心软件的稳定由于不修改软件原来的模块,不用担心软件的稳定性。性。2021-10-22软件工程专业112.3里氏代换原则里氏代换原则v如果调用的是父类的话,那么换成子类也完全可以如果调用的是父类的话,那么换成子类也完全可以运行。运行。2021-10-22软件工程专业122.4依赖倒转原则依赖倒转原则v抽象不应该依赖于细节,细节应当依赖于抽象。抽象不应该依赖于细节,细节应当依赖于抽象。v要针对接口编程,而不是针对实现编程。要针对接口编程,而不是针对实现编

11、程。2021-10-22软件工程专业132.5多用组合少用继承原则多用组合少用继承原则 v设计中避开类继承的缺点,充分使用对象组合的优设计中避开类继承的缺点,充分使用对象组合的优点。点。 2021-10-22软件工程专业142.6高内聚高内聚-低耦合原则低耦合原则 v如果类中的方法是一组相关的行为,则称该类是高如果类中的方法是一组相关的行为,则称该类是高内聚的,反之称为低内聚的。内聚的,反之称为低内聚的。v所谓低耦合就是尽量不要让一个类含有太多的其它所谓低耦合就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改系统的其中一部分会类的实例的引用,以避免修改系统的其中一部分会影响到其它部分

12、。影响到其它部分。 2021-10-22软件工程专业15软件设计模式软件设计模式 第第3 3章章UMLUML类图简介类图简介3.1类类(Class)v在在UMLUML中,使用一个长方形描述一个类的主要构成中,使用一个长方形描述一个类的主要构成,将长方形垂直地分为三层,将长方形垂直地分为三层 。v第第1 1层是名字层,类名字是常规字形,表明该类是层是名字层,类名字是常规字形,表明该类是具体类,类名字是斜体字形,表明该类是抽象类。具体类,类名字是斜体字形,表明该类是抽象类。 v 第第2 2层是变量层,也称属性层,列出类的成员变量层是变量层,也称属性层,列出类的成员变量及类型,格式是及类型,格式是“

13、变量名字:类型变量名字:类型”。 v第第3 3层是方法层,也称操作层,列出类的方法及返层是方法层,也称操作层,列出类的方法及返回类型,格式是回类型,格式是“方法名字(参数列表):类型方法名字(参数列表):类型” ” 2021-10-22软件工程专业173.1类类(Class)2021-10-22软件工程专业18Student+name:String#age:int-money:double+setName(String):void#printMess():void+getAge():intsetAge(int):void-getMoney();名字层名字层 变量层变量层 方法层方法层 +#-p

14、rotected的的private的的友好的友好的的的public的的变量变量或或方法方法的访问权限是的访问权限是名字名字前加前加3.2接口(接口(Interface)v表示接口的表示接口的UMLUML图和表示类的图和表示类的UMLUML图类似,使用一个图类似,使用一个长方形描述一个接口的主要构成,将长方形垂直地长方形描述一个接口的主要构成,将长方形垂直地分为三层分为三层 。v第第1 1层是名字层,接口的名字必须是斜体字形,而层是名字层,接口的名字必须是斜体字形,而且需要用且需要用修饰名字,并且该修饰和修饰名字,并且该修饰和名字分列在名字分列在2 2行。行。v第第2 2层是常量层,列出接口中的

15、常量及类型,格式层是常量层,列出接口中的常量及类型,格式是是“常量名字:类型常量名字:类型”。 v第第3 3层是方法层,也称操作层,列出接口中的方法层是方法层,也称操作层,列出接口中的方法及返回类型,格式是及返回类型,格式是“方法名字(参数列表):类方法名字(参数列表):类型型”。 2021-10-22软件工程专业193.2接口(接口(Interface)2021-10-22软件工程专业20Creator +MAX:int +factoryMethod():Product 名字层名字层 常量层常量层 方法层方法层 +public的的常量常量或或方法方法的访问权限是的访问权限是名字名字前加前加3

16、.3泛化关系(泛化关系(Generalization) 2021-10-22软件工程专业21 对于面向对象语言,对于面向对象语言,UMLUML中所中所说的泛化关系就是指类的继承关系说的泛化关系就是指类的继承关系。如果一个类是另一个类的子类,。如果一个类是另一个类的子类,那么那么UMLUML通过使用一个实线连接两个通过使用一个实线连接两个类的类的UMLUML图来表示二者之间的继承关图来表示二者之间的继承关系,实线的起始端是子类的系,实线的起始端是子类的UMLUML图,图,终点端是父类的终点端是父类的UMLUML图,但终点端使图,但终点端使用一个空心的三角形表示实线的结用一个空心的三角形表示实线的

17、结束束 。 3.4关联关系关联关系2021-10-22软件工程专业22 如果如果A A类中成员变量是用类中成员变量是用B B类(接口)来声明的变量类(接口)来声明的变量,那么,那么A A和和B B的关系是关联关系,称的关系是关联关系,称A A关联于关联于B B。那么。那么UMLUML通通过使用一个实线连过使用一个实线连A A和和B B的的UMLUML图,实线的起始端是图,实线的起始端是A A的的UMLUML图,终点端是图,终点端是B B的的UMLUML图,但终点端使用一个指向图,但终点端使用一个指向B B的的UMLUML图图的方向箭头表示实线的结束的方向箭头表示实线的结束 。 3.5依赖关系依

18、赖关系2021-10-22软件工程专业23 如果如果A A类中某个方法的参数用类中某个方法的参数用B B类(接口)来声明的类(接口)来声明的变量或某个方法返回的数据类型是变量或某个方法返回的数据类型是B B类型的,那么类型的,那么A A和和B B的的关系是依赖关系,称关系是依赖关系,称A A依赖于依赖于B B。那么。那么UMLUML通过使用一个虚通过使用一个虚线连线连A A和和B B的的UMLUML图,虚线的起始端是图,虚线的起始端是A A的的UMLUML图,终点端是图,终点端是B B的的UMLUML图,但终点端使用一个指向图,但终点端使用一个指向B B的的UMLUML图的方向箭头表图的方向箭

19、头表示虚线的结束。示虚线的结束。 3.6实现关系实现关系2021-10-22软件工程专业24 如果一个类实现了一如果一个类实现了一个接口,那么类和接口的关个接口,那么类和接口的关系是实现关系,称类实现接系是实现关系,称类实现接口。口。UMLUML通过使用虚线连接通过使用虚线连接类和它所实现的接口,虚线类和它所实现的接口,虚线起始端是类,虚线的终点端起始端是类,虚线的终点端是它实现的接口,但终点端是它实现的接口,但终点端使用一个空心的三角形表示使用一个空心的三角形表示虚线的结束虚线的结束 。3.7注释注释2021-10-22软件工程专业25 UML UML使用注释为类图提供附加的说明。使用注释为

20、类图提供附加的说明。UMLUML在一个带卷角在一个带卷角的长方形中显示给出的注释,并使用虚线将这个带卷角的长方的长方形中显示给出的注释,并使用虚线将这个带卷角的长方形和所它所注释的实体连接起来形和所它所注释的实体连接起来 。软件设计模式软件设计模式 第第4 4章工厂模式章工厂模式4.1工厂模式问题工厂模式问题v在面向对象编程中在面向对象编程中, , 最通常的方法是一个最通常的方法是一个newnew操作操作符产生一个对象实例符产生一个对象实例,new,new操作符就是用来构造对象操作符就是用来构造对象实例的。实例的。v一些情况下一些情况下, new, new操作符直接生成对象会带来一些操作符直接

21、生成对象会带来一些问题。问题。 创建对象之前必须清楚所要创建对象的类信息,创建对象之前必须清楚所要创建对象的类信息,但个别情况下无法达到此要求。但个别情况下无法达到此要求。 许多类型对象的创造需要一系列步骤。许多类型对象的创造需要一系列步骤。v在这些情况在这些情况, , 新对象的建立就是一个新对象的建立就是一个 “ “过程过程”,而不仅仅是一个操作。而不仅仅是一个操作。2021-10-22软件工程专业274.1工厂模式问题工厂模式问题2021-10-22软件工程专业28模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢?4.2工厂模式的解决方案工厂模式的解决方

22、案v举个例子举个例子 假如还没有工业革命,如果一个客户要一款宝马假如还没有工业革命,如果一个客户要一款宝马车车, ,一般的做法是一般的做法是客户去生产一款宝马车客户去生产一款宝马车,然后,然后拿来用。拿来用。 后来出现工业革命。用户不用去创建宝马车。因后来出现工业革命。用户不用去创建宝马车。因为为客户有一个工厂来帮他创建宝马客户有一个工厂来帮他创建宝马. .想要什么车想要什么车,这个工厂就可以建。,这个工厂就可以建。2021-10-22软件工程专业294.2工厂模式的解决方案工厂模式的解决方案v举个例子(续)举个例子(续) 为了满足客户,宝马车系列越来越多,如为了满足客户,宝马车系列越来越多,

23、如320i320i,523i,30li523i,30li等系列一个工厂无法创建所有的宝马等系列一个工厂无法创建所有的宝马系列。于是由系列。于是由单独分出来多个具体的工厂单独分出来多个具体的工厂。每个。每个具体工厂创建一种系列。具体工厂创建一种系列。 随着客户的要求越来越高,宝马车必须配置空调随着客户的要求越来越高,宝马车必须配置空调。而且这空调必须对应给系列车才能使用。于是。而且这空调必须对应给系列车才能使用。于是这个这个工厂开始生产宝马车和需要的空调。工厂开始生产宝马车和需要的空调。最终是最终是客户只要对宝马的销售员说:我要客户只要对宝马的销售员说:我要523i523i空调车,空调车,销售员

24、就直接给他销售员就直接给他523i523i空调车了。而不用自己去空调车了。而不用自己去创建创建523i523i空调车宝马车空调车宝马车. . 2021-10-22软件工程专业304.2工厂模式的解决方案工厂模式的解决方案v结论结论 产品应该由工厂生产,而不是由客户去生产。产品应该由工厂生产,而不是由客户去生产。 客户只需要知道产品在哪买,而不需要知道产品客户只需要知道产品在哪买,而不需要知道产品如何制作。如何制作。 类的对象也是一种产品,所以需要对象工厂去负类的对象也是一种产品,所以需要对象工厂去负责创建。责创建。 解决方案:建立一个工厂来创建对象。解决方案:建立一个工厂来创建对象。2021-

25、10-22软件工程专业314.3工厂模式的分类工厂模式的分类v在在GOFGOF的的设计模式设计模式一书中,工厂模式就是说明一书中,工厂模式就是说明通过工厂类来创建对象的模式。通过工厂类来创建对象的模式。v工厂模式分为三类:工厂模式分为三类: 简单工厂模式简单工厂模式 工厂方法模式工厂方法模式 抽象工厂模式抽象工厂模式v这三种模式从上到下逐步抽象,并且更具一般性。这三种模式从上到下逐步抽象,并且更具一般性。vGOFGOF在在设计模式设计模式一书中将工厂模式分为两类:一书中将工厂模式分为两类:工厂方法模式(工厂方法模式(Factory MethodFactory Method)与抽象工厂模式)与抽

26、象工厂模式(Abstract FactoryAbstract Factory)。将简单工厂模式()。将简单工厂模式(Simple Simple FactoryFactory)看为工厂方法模式的一种特例,两者归)看为工厂方法模式的一种特例,两者归为一类。为一类。 2021-10-22软件工程专业324.3工厂模式的分类工厂模式的分类v简单工厂模式简单工厂模式 由一个工厂对象决定创建出哪一种产品类的实例由一个工厂对象决定创建出哪一种产品类的实例 工厂模式家族中最简单实用的模式,可以理解为工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。是不同工厂模式的一个特殊实现。 是由一个

27、工厂类根据传入的参数,动态决定应该是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。或接口)的实例。2021-10-22软件工程专业334.3工厂模式的分类工厂模式的分类v简单工厂模式(续)简单工厂模式(续)该模式中包含的角色及其该模式中包含的角色及其职责职责 工厂工厂(CreatorCreator)角色角色 抽象产品(抽象产品(ProductProduct)角色角色 具体产品(具体产品(Concrete ProductConcrete Product)角色)角色2021-10-22软件工程专业344.

28、3工厂模式的分类工厂模式的分类v简单工厂模式(续)简单工厂模式(续) UMLUML类图类图2021-10-22软件工程专业354.3工厂模式的分类工厂模式的分类v工厂方法模式工厂方法模式 定义一个创建产品对象的工厂接口,将实际创建定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。工作推迟到子类当中。 核心工厂类不再负责产品的创建,这样核心类成核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口。实现的接口。 工厂方法模式是简单工厂模式的衍生,解决了许工厂方法模式是简单工厂模式的衍生,解决了许多简单工

29、厂模式的问题。首先完全实现多简单工厂模式的问题。首先完全实现开闭开闭 原则原则,实现了可扩展。,实现了可扩展。2021-10-22软件工程专业364.3工厂模式的分类工厂模式的分类v工厂方法工厂方法模式(续)模式(续)该模式中包含的角色及其职责该模式中包含的角色及其职责 抽象工厂抽象工厂(Creator)(Creator)角色角色 具体工厂具体工厂(Concrete Creator)(Concrete Creator)角色角色 抽象产品抽象产品(Product)(Product)角色角色 具体产品具体产品(Concrete Product)(Concrete Product)角色角色2021-

30、10-22软件工程专业374.3工厂模式的分类工厂模式的分类v工厂方法模式(续)工厂方法模式(续) UMLUML类图类图2021-10-22软件工程专业384.3工厂模式的分类工厂模式的分类v抽象工厂模式抽象工厂模式 所有形态的工厂模式中最为抽象和最具一般性的所有形态的工厂模式中最为抽象和最具一般性的一种形态。一种形态。 抽象工厂模式是指当有多个抽象角色时,使用的抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。一种工厂模式。 抽象工厂模式可以向客户端提供一个接口,使客抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个户端在不必指定产品的具体的情况下,创

31、建多个产品族中的产品对象。产品族中的产品对象。 为创建一组相关或相互依赖的对象提供一个接口为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。,而且无需指定他们的具体类。2021-10-22软件工程专业394.3工厂模式的分类工厂模式的分类v抽象工厂模式(续)抽象工厂模式(续) 抽象工厂模式的用意为:给客户端提供一个接口抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象,可以创建多个产品族中的产品对象 ,而且使,而且使用抽象工厂模式还要满足一下条件:用抽象工厂模式还要满足一下条件: 系统中有多个产品族,而系统一次只可能消系统中有多个产品族,而系统一次只

32、可能消费其中一族产品。费其中一族产品。 同属于同一个产品族的产品以其使用。同属于同一个产品族的产品以其使用。 2021-10-22软件工程专业404.3工厂模式的分类工厂模式的分类v抽象工厂模式(续)抽象工厂模式(续)该模式中包含的角色及其职责该模式中包含的角色及其职责 抽象工厂抽象工厂(Creator)(Creator)角色角色 具体工厂具体工厂(Concrete Creator)(Concrete Creator)角色角色 抽象产品抽象产品(Product)(Product)角色角色 具体产品具体产品(Concrete Product)(Concrete Product)角色角色2021-

33、10-22软件工程专业414.3工厂模式的分类工厂模式的分类v抽象工厂模式(续抽象工厂模式(续) UML UML类图类图2021-10-22软件工程专业42软件设计模式软件设计模式 第第5 5章单例模式章单例模式5.1单例模式问题单例模式问题v几乎所有面向对象的程序中,总有一些类的对象需几乎所有面向对象的程序中,总有一些类的对象需要是唯一的。例如,通过数据库句柄到数据库的连要是唯一的。例如,通过数据库句柄到数据库的连接是独占的。接是独占的。2021-10-22软件工程专业44 模式问题:怎样确保一个特殊类模式问题:怎样确保一个特殊类的实例是独一无二的(它是这个类的的实例是独一无二的(它是这个类

34、的唯一实例),并且这个实例易于被访唯一实例),并且这个实例易于被访问呢?问呢?5.2单例模式的解决方案单例模式的解决方案v举个例子举个例子 有一个成语叫有一个成语叫“独一无二独一无二”,以表示事物的珍贵,以表示事物的珍贵 在中国古代,就有在中国古代,就有“国无二主国无二主”的说法,也就是的说法,也就是说一个国家只有一个皇帝。说一个国家只有一个皇帝。2021-10-22软件工程专业455.2单例模式的解决方案单例模式的解决方案v一个全局变量使得一个对象可以被访问,但它不能一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。因为你的任何代码都能修防止你实例化多个对象。因为你的任何代码

35、都能修改全局变量,这将不可避免的引起更多调试的意外改全局变量,这将不可避免的引起更多调试的意外。换句话说,全局变量的状态总是会出现一些问题。换句话说,全局变量的状态总是会出现一些问题的。的。v让类自身负责保存它的唯一实例让类自身负责保存它的唯一实例( (静态变量静态变量) )。这个。这个类可以保证没有其他实例可以被创建(通过截取创类可以保证没有其他实例可以被创建(通过截取创建新对象的请求)建新对象的请求) ,并且它可以提供一个访问该,并且它可以提供一个访问该实例的方法(静态方法)。实例的方法(静态方法)。2021-10-22软件工程专业465.2单例模式的解决方案单例模式的解决方案 单例模式定

36、义:单例模式定义:“一个类有一个类有且且仅有一个实例仅有一个实例,并且自行实例,并且自行实例化向整个系统提供。化向整个系统提供。”2021-10-22软件工程专业475.3 单例模式结构单例模式结构v模式的结构中只包括一个角色模式的结构中只包括一个角色 单件类(单件类(SingletonSingleton)v单例模式有两种形式单例模式有两种形式 饿汉单例饿汉单例, ,也就是也就是, ,类被加载的时候就已经创建好类被加载的时候就已经创建好了单例。了单例。 懒汉单例懒汉单例, ,也就是第一次调用的时候被创建。也就是第一次调用的时候被创建。2021-10-22软件工程专业485.3 单例模式结构单例

37、模式结构vUMLUML类图类图2021-10-22软件工程专业49软件设计模式软件设计模式 第第6 6章原型模式章原型模式6.1原型模式问题原型模式问题v在软件系统中,客户希望创建一个类对象(产品)在软件系统中,客户希望创建一个类对象(产品)时,可能有三种情况:时,可能有三种情况: 知道产品具体型号知道产品具体型号( (使用使用newnew运算符创建运算符创建) ) 不知道型号,知道特定的需求不知道型号,知道特定的需求( (使用工厂模式使用工厂模式) ) 不知道需求,但想要一个。和已知对象相同的对不知道需求,但想要一个。和已知对象相同的对象。象。2021-10-22软件工程专业516.1原型模

38、式问题原型模式问题模式问题:当模式问题:当对象的构造函数非常对象的构造函数非常复杂,在生成新对象的时候非常耗时复杂,在生成新对象的时候非常耗时间、耗资源的情况?我们是怎么来创间、耗资源的情况?我们是怎么来创建呢?建呢?2021-10-22软件工程专业526.1原型模式解决方案原型模式解决方案v举个例子:举个例子:例子例子1 1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来空来。例子例子2 2:寄个快递:寄个快递 下面是一个邮寄快递的场景:下面是一个邮寄快递的场景: “ “给我寄个快递。给我寄个快递。”顾客说。顾客说。 “ “寄往什么地方?寄

39、给寄往什么地方?寄给?”你问。你问。 “ “和上次差不多一样,只是邮寄给另外一个地址,这里是邮和上次差不多一样,只是邮寄给另外一个地址,这里是邮寄地址寄地址”顾客一边说一边把写有邮寄地址的纸条给你。顾客一边说一边把写有邮寄地址的纸条给你。 “ “好!好!”你愉快地答应,因为你保存了用户的以前邮寄信息你愉快地答应,因为你保存了用户的以前邮寄信息,只要复制这些数据,然后通过简单的修改就可以快速地创建,只要复制这些数据,然后通过简单的修改就可以快速地创建新的快递数据了。新的快递数据了。 2021-10-22软件工程专业536.2原型模式解决方案原型模式解决方案v通过复制(克隆、拷贝)一个指定类型的对

40、象来创通过复制(克隆、拷贝)一个指定类型的对象来创建更多同类型的对象。建更多同类型的对象。v这个指定的对象可被称为这个指定的对象可被称为“原型原型”对象,也就是通对象,也就是通过复制原型对象来得到更多同类型的对象。过复制原型对象来得到更多同类型的对象。v用原型实例指定创建对象的种类,并且通过拷贝这用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象的模式称为原型模式。些原型创建新的对象的模式称为原型模式。v原型模式是从一个对象出发得到一个和自己有相同原型模式是从一个对象出发得到一个和自己有相同状态的新对象的成熟模式,该模式的关键是将一个状态的新对象的成熟模式,该模式的关键是将一个对象

41、定义为原型,并为其提供复制自己的方法。对象定义为原型,并为其提供复制自己的方法。 2021-10-22软件工程专业546.2原型模式解决方案原型模式解决方案2021-10-22软件工程专业556.2原型模式解决方案原型模式解决方案v浅拷贝指被拷贝对象的所有变量都含有与原对象相浅拷贝指被拷贝对象的所有变量都含有与原对象相同的值,而且对其他对象的引用仍然是指向原来的同的值,而且对其他对象的引用仍然是指向原来的对象。即浅拷贝只负责当前对象实例,对引用的对对象。即浅拷贝只负责当前对象实例,对引用的对象不做拷贝。象不做拷贝。2021-10-22软件工程专业566.2原型模式解决方案原型模式解决方案v深拷

42、贝指被拷贝对象的所有的变量都含有与原来对深拷贝指被拷贝对象的所有的变量都含有与原来对象相同的值,除了那些引用其他对象的变量。那些象相同的值,除了那些引用其他对象的变量。那些引用其他对象的变量将指向一个被拷贝的新对象,引用其他对象的变量将指向一个被拷贝的新对象,而不再是原有那些被引用对象。即而不再是原有那些被引用对象。即 深拷贝把要拷深拷贝把要拷贝的对象所引用的对象也都拷贝了一次,而这种对贝的对象所引用的对象也都拷贝了一次,而这种对被引用到的对象拷贝叫做间接拷贝。被引用到的对象拷贝叫做间接拷贝。2021-10-22软件工程专业576.3原型模式的结构原型模式的结构v模式的结构中包括两种角色:模式

43、的结构中包括两种角色: 抽象原型(抽象原型(PrototypePrototype) 具体原型(具体原型(Concrete PrototypeConcrete Prototype) 2021-10-22软件工程专业586.3原型模式的结构原型模式的结构vUMLUML类图类图2021-10-22软件工程专业59软件设计模式软件设计模式 第第7 7章外观模式章外观模式7.1外观模式问题外观模式问题v我们通过外观的包装,使应用程序只能看到外观对我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了

44、程序的可维护性。应用程序的复杂度,并且提高了程序的可维护性。2021-10-22软件工程专业61 模式问题:为了降低复杂性,常常将系统划分为若干个子系统。但是如何做到各个系统之间的通信和相互依赖关系达到最小呢?7.2模式的解决方案模式的解决方案v举个例子举个例子一个电源总开关可以控制四盏灯、一个风扇、一一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。该电源总开关可台空调和一台电视机的启动和关闭。该电源总开关可以同时控制上述所有电器以同时控制上述所有电器设备设备。2021-10-22软件工程专业627.2模式的解决方案模式的解决方案2021-10-22软件工程专业637

45、.2模式的解决方案模式的解决方案2021-10-22软件工程专业647.2模式的解决方案模式的解决方案v外观模式为系统中的一组接口提供一个一致的界面外观模式为系统中的一组接口提供一个一致的界面,FaFaadeade模式定义了一个高层接口,这个接口使得模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。这一子系统更加容易使用。v外观模式的关键是为子系统提供一个称作外观的类外观模式的关键是为子系统提供一个称作外观的类,该外观类的实例负责和子系统中类的实例打交道,该外观类的实例负责和子系统中类的实例打交道v当用户想要和子系统中的若干个类的实例打交道时当用户想要和子系统中的若干个类的实例打交道

46、时,可以代替地和子系统的外观类的实例打交道。,可以代替地和子系统的外观类的实例打交道。 2021-10-22软件工程专业657.3外观模式的结构外观模式的结构v模式的结构中包括两种角色模式的结构中包括两种角色 子系统(子系统(SubsystemSubsystem) 外观(外观(FacadeFacade) 2021-10-22软件工程专业667.3外观模式的结构外观模式的结构vUMLUML类图类图2021-10-22软件工程专业67软件设计模式软件设计模式 第第8 8章装饰模式章装饰模式8.1装饰模式的问题装饰模式的问题v若你从事过面向对象开发,实现给一个类或对象增若你从事过面向对象开发,实现给

47、一个类或对象增加行为,使用继承机制,这是所有面向对象语言的加行为,使用继承机制,这是所有面向对象语言的一个基本特性。一个基本特性。v如果已经存在的一个类缺少某些方法,或者须要给如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类这个类来产生一个新类这建立在额外的代码上。这建立在额外的代码上。v通过继承一个现有类可以使得子类在拥有自身方法通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和

48、时机。,用户不能控制增加行为的方式和时机。2021-10-22软件工程专业698.1装饰模式的问题装饰模式的问题模式问题:你如何组织你的代码使模式问题:你如何组织你的代码使其可以容易的添加基本的或者一些很其可以容易的添加基本的或者一些很少用到的少用到的 特性,而不是直接将额外特性,而不是直接将额外的代码写在你的类的内部?的代码写在你的类的内部?2021-10-22软件工程专业708.2装饰模式的解决方案装饰模式的解决方案v举个例子举个例子一个鸟只能飞一个鸟只能飞100100米,如果让它飞行米,如果让它飞行150150米,就必米,就必须给它装一个电子翅膀,就可以实现飞行更远的距离须给它装一个电子

49、翅膀,就可以实现飞行更远的距离。2021-10-22软件工程专业718.2装饰模式的解决方案装饰模式的解决方案v装饰模式是在不必改变原类文件和使用继承的情况装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。下,动态地扩展一个对象的功能。v它是通过创建一个包装对象,也就是装饰来包裹真它是通过创建一个包装对象,也就是装饰来包裹真实的对象。实的对象。v 装饰模式动态地给一个对象添加一些额外的职责装饰模式动态地给一个对象添加一些额外的职责或者行为。就增加功能来说,装饰模式相比生成子或者行为。就增加功能来说,装饰模式相比生成子类更为灵活。类更为灵活。v 装饰器模式提供了改变子类的

50、灵活方案。装饰器装饰器模式提供了改变子类的灵活方案。装饰器模式在不必改变原类文件和使用继承的情况下,动模式在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。对象,也就是装饰来包裹真实的对象。2021-10-22软件工程专业728.3装饰模式的结构装饰模式的结构v装饰模式的结构中包括四种角色:装饰模式的结构中包括四种角色: 抽象组件(抽象组件(ComponentComponent) 具体组件(具体组件(ConcreteComponentConcreteComponent) 装饰(装饰(

51、DecoratorDecorator) 具体装饰(具体装饰(ConcreteDecotatorConcreteDecotator) 2021-10-22软件工程专业738.3装饰模式的结构装饰模式的结构vUMLUML类图类图2021-10-22软件工程专业74软件设计模式软件设计模式 第第9 9章桥接模式章桥接模式9.1桥接模式的问题桥接模式的问题v在软件系统中,某些类型由于自身的逻辑,它具有在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种两个或多个维度的变化,那么如何应对这种“多维多维度的变化度的变化”?v如何利用面向对象的技术来使得该类型能够轻松的如何利用

52、面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度沿着多个方向进行变化,而又不引入额外的复杂度?2021-10-22软件工程专业769.2桥接模式的解决方案桥接模式的解决方案v举个例子举个例子例子例子1 1:设想如果要绘制矩形、圆形、椭圆、正方形,我们:设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要至少需要4 4个形状类,但是如果绘制的图形需要具有不同的颜个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:第一种设计方案是为每一种形状都提供一套各种颜色的版第一种

53、设计方案是为每一种形状都提供一套各种颜色的版本本。第二种设计方案是根据实际需要对形状和颜色进行组合。第二种设计方案是根据实际需要对形状和颜色进行组合。 2021-10-22软件工程专业779.2桥接模式的解决方案桥接模式的解决方案v桥接模式将抽象部分与它的实现部分分离,使得它桥接模式将抽象部分与它的实现部分分离,使得它们都可以独立地变化。们都可以独立地变化。v将抽象化与实现化脱耦,使得二者可以独立地变化将抽象化与实现化脱耦,使得二者可以独立地变化 抽象化就是忽略一些信息,把不同的实体当作同抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性样的实体对待。在面向对

54、象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。质抽取出来形成类的过程即为抽象化的过程。 针对抽象化给出的具体实现,就是实现化,抽象针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具象比抽象化更具体,是对抽象化事物的进一步具体化的产物体化的产物2021-10-22软件工程专业789.2桥接模式的解决方案桥接模式的解决方案v将抽象化与实现化脱耦,使得二者可以独立地变化将抽象化与实现化脱耦,使得二者可以独立地变化 脱耦就是脱耦就是将抽象化和实现化之间的耦合解脱开,将抽象

55、化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联或者说是将它们之间的强关联改换成弱关联,将将两个角色之间的继承关系改为关联关系两个角色之间的继承关系改为关联关系。 桥接模式中的所谓脱耦,就是指在一个软件系统桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。对独立地变化,这就是桥接模式的用意。 2021-10-22软件工程专业799.3桥接模式的结构桥接模式的结构v模式的结构中包括四种

56、角色模式的结构中包括四种角色 抽象(抽象(AbstractionAbstraction) 实现者(实现者(ImplementorImplementor) 细化抽象(细化抽象(Refined AbstractionRefined Abstraction) 具体实现者(具体实现者(Concrete ImplementorConcrete Implementor) 2021-10-22软件工程专业809.3桥接模式的结构桥接模式的结构vUMLUML类图类图2021-10-22软件工程专业81软件设计模式软件设计模式 第第1010章命令模式章命令模式10.1命令模式的问题命令模式的问题v在软件设计中,

57、我们经常需要向某些对象发送请求在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个。求的操作是哪个。v我们只需在程序运行时指定具体的请求接收者即可我们只需在程序运行时指定具体的请求接收者即可v在软件系统中,在软件系统中,“行为请求者行为请求者”与与“行为实现者行为实现者”通常呈现一种通常呈现一种“紧耦合紧耦合”。在这种情况下,如何将。在这种情况下,如何将“行为请求者行为请求者”与与“行为实现者行为实现者”解耦?解耦?2021-10-22软件工程专业8310.2命令模式的解决方案命令模式的解决方案v举个

58、例子举个例子电视机遥控器电视机遥控器 : : 遥控器是请求的发送者,电视机遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关是请求的接收者,遥控器上有一些按钮如开,关, ,换换频道等按钮就是具体命令,不同的按钮对应电视机的频道等按钮就是具体命令,不同的按钮对应电视机的不同操作。不同操作。2021-10-22软件工程专业8410.2命令模式的解决方案命令模式的解决方案v命令模式命令模式(Command Pattern)(Command Pattern):将将一个请求封装:将将一个请求封装为一个对象,从而使我们可用不同的请求对客户进为一个对象,从而使我们可用不同的请求对客户进行

59、参数化;对请求排队或者记录请求日志,以及支行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。持可撤销的操作。2021-10-22软件工程专业8510.3命令模式的结构命令模式的结构v模式的结构中包括四种角色:模式的结构中包括四种角色: 接收者(接收者(ReceiverReceiver) 命令命令(Command)(Command)接口接口 具体命令(具体命令(ConcreteCommandConcreteCommand) 请求者(请求者(InvokerInvoker)2021-10-22软件工程专业8610.3命令模式的结构命令模式的结构vUMLUML类图类图2021-10-22软件

60、工程专业87软件设计模式软件设计模式 第第1111章观察者模式章观察者模式11.1观察者模式的问题观察者模式的问题v一些面向对象的编程方式,提供了一种构建对象间一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力。当对象们连接在一起时,它复杂网络互连的能力。当对象们连接在一起时,它们就可以相互提供服务和信息。们就可以相互提供服务和信息。v通常来说,当某个对象的状态发生改变时,你仍然通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信。需要对象之间能互相通信。v当一个对象的状态发生改变时,你如何通知其他对当一个对象的状态发生改变时,你如何通知其他对象?是否需要一个动态方案

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论