1、基本概念基本概念n软件设计模式:软件设计模式:广义定义:可解决一类软件问题并能重广义定义:可解决一类软件问题并能重复使用的软件设计方案复使用的软件设计方案狭义定义:设计模式是对被用来在特定狭义定义:设计模式是对被用来在特定场景下解决一般设计问题的类和相互通场景下解决一般设计问题的类和相互通信的对象的描述。是在类和对象的层次信的对象的描述。是在类和对象的层次描述的可重复使用的软件设计问题解决描述的可重复使用的软件设计问题解决方案。方案。基本概念基本概念n软件体系结构风格:是在构件和连接子的层次所描软件体系结构风格:是在构件和连接子的层次所描述的可重复使用的软件设计问题解决方案。述的可重复使用的软
2、件设计问题解决方案。基本概念基本概念n二者的共性和区别:二者的共性和区别:区别:区别:1 1、设计模式是在类和对象的层次描述问题,、设计模式是在类和对象的层次描述问题,粒度较小;粒度较小;2 2、体系结构风格是在构件和连接子的层次描、体系结构风格是在构件和连接子的层次描 述问题,粒度较大。体系结构风格是广义述问题,粒度较大。体系结构风格是广义 上的设计模式。上的设计模式。共性:都是可重复使用的软件设计问题解决方案共性:都是可重复使用的软件设计问题解决方案n软件体系结构描述语言软件体系结构描述语言Architectural Description LanguageArchitectural De
3、scription Language,简称,简称ADLADL是用来描述软件密集型系统的总体结构的语言,说明是用来描述软件密集型系统的总体结构的语言,说明系统众多部件之间的结构关系。系统众多部件之间的结构关系。n代表性的体系结构描述语言代表性的体系结构描述语言nWrightWrightnRapideRapidenDarwinDarwinnUniconUniconnACMEACMEnABC/ADLABC/ADLnXYZ/ADLXYZ/ADLnXADLXADL大部分结构描述语言都有构件、连接子、配置等概念大部分结构描述语言都有构件、连接子、配置等概念nWright ADLWright ADL构件(构
4、件(ComponentComponent)连接子(连接子(ConnectorConnector)端口(端口(PortsPorts)构件规范(构件规范(Component-specComponent-spec)计算(计算(ComputationComputation)配置(配置(ConfigurationConfiguration)角色(角色(RolesRoles)粘连(粘连(GlueGlue)实例(实例(InstancesInstances)联接(联接(AttachmentsAttachments)Wright ADLWright ADLn过程调用实例:过程调用实例:一个一个CallerCal
5、ler类型的构件类型的构件c c通过通过D-C-connectorD-C-connector类型类型的的 连接子连接子dcdc调用调用DefinerDefiner类型的构件类型的构件d d c 调用调用 d调用实例的调用实例的Wright体系结构描述体系结构描述图形化的体系结构描述语言图形化的体系结构描述语言GADLGADLnGADLGADL的元模型的元模型图形化的体系结构描述语言图形化的体系结构描述语言GADLGADL调用实例的调用实例的GADLGADL体系结构描述体系结构描述构件图构件图构件构件连接子连接子端口端口角色角色图形化的体系结构描述语言图形化的体系结构描述语言GADLGADL调用
6、实例的调用实例的GADLGADL体系结构描述体系结构描述类图类图图形化的体系结构描述语言图形化的体系结构描述语言GADLGADLn一个图形化的体系结构描述语言一个图形化的体系结构描述语言GADLGADL调用实例的调用实例的GADLGADL体系结构描述体系结构描述协议类图和顺协议类图和顺序图序图WrightWright与与GADLGADLnGADLGADL语言用构件图、类图、顺序图等方式描述系语言用构件图、类图、顺序图等方式描述系统的软件体系结构,对行为的描述统的软件体系结构,对行为的描述GADLGADL用顺序图用顺序图,而,而WrightWright用进行代数用进行代数CSPCSP。n在构件和
7、连接子的层次上描述的可重复使用的软在构件和连接子的层次上描述的可重复使用的软件设计问题解决方案。件设计问题解决方案。1.1.管道管道/过滤器风格过滤器风格2.2.层次风格层次风格3.3.客户客户/服务器风格服务器风格核心特征、应用场景、注意的问题核心特征、应用场景、注意的问题(1 1)管道)管道/过滤器风格过滤器风格n实例剖析:实例剖析:统计统计a.txta.txt中单词的个数并打印出来:中单词的个数并打印出来:shellshell命令:命令:“cat a.txt|wc-w|lpr”cat a.txt|wc-w|lpr”1、cat命令输出命令输出a.txt的内容的内容2、通过管道传给命令、通过
8、管道传给命令wc,统计输入流中单词的,统计输入流中单词的 个数并输出个数并输出3、输出的单词数通过管道传给命令、输出的单词数通过管道传给命令lpr,lpr将其将其 打印出来打印出来 构件图构件图命令是构件、管道是连接子命令是构件、管道是连接子(1 1)管道)管道/过滤器风格过滤器风格n实例剖析:实例剖析:shellshell命令:命令:“cat a.txt|wc-w|lpr”cat a.txt|wc-w|lpr”类类图图(1 1)管道)管道/过滤器风格过滤器风格n实例剖析:实例剖析:shellshell命令:命令:“cat a.txt|wc-w|lpr”cat a.txt|wc-w|lpr”W
9、riteData协议类图和顺序图协议类图和顺序图(1 1)管道)管道/过滤器风格过滤器风格n实例剖析:实例剖析:shellshell命令:命令:“cat a.txt|wc-w|lpr”cat a.txt|wc-w|lpr”ReadData协议类图和顺序图协议类图和顺序图(1 1)管道)管道/过滤器风格过滤器风格n实例剖析:实例剖析:打印打印a.txta.txt中中softsoft的个数的个数“cat a.txt|grep-o soft|wc-w|lpr”cat a.txt|grep-o soft|wc-w|lpr”构件图构件图(1 1)管道)管道/过滤器风格过滤器风格n特征:系统中构件之间通过
10、数据流松散耦合。也特征:系统中构件之间通过数据流松散耦合。也就是说,构件之间的依赖仅仅是数据流,而不是就是说,构件之间的依赖仅仅是数据流,而不是通常的接口函数调用或消息传递。通常的接口函数调用或消息传递。n其他典型应用:编译器、信号处理等。其他典型应用:编译器、信号处理等。n其他说明:本模式在实现上可以有许多不同的变其他说明:本模式在实现上可以有许多不同的变化,如主动与被动、多出口管道等。化,如主动与被动、多出口管道等。(2 2)层次风格)层次风格n实例剖析:数据库系统实例剖析:数据库系统用户接口(查询、创建等)用户接口(查询、创建等)数据库管理数据库管理数据库文件(文件管理功能)数据库文件(
11、文件管理功能)文件管理文件管理外部设备(设备管理功能)外部设备(设备管理功能)设备管理设备管理(2 2)层次风格)层次风格n实例剖析:数据库系统实例剖析:数据库系统数据库服务端口数据库服务端口db(2 2)层次风格)层次风格n特征:从向外提供服务的构件出发,沿着连接关特征:从向外提供服务的构件出发,沿着连接关系递次搜索各构件和连接子,如果形成的拓扑结系递次搜索各构件和连接子,如果形成的拓扑结构是一个有向无圈图(典型情况下是一个线性结构是一个有向无圈图(典型情况下是一个线性结构),那么这个系统的体系结构风格就是层次式构),那么这个系统的体系结构风格就是层次式的。的。n这种设计风格便于将复杂的系统
12、进行分解;同时这种设计风格便于将复杂的系统进行分解;同时也便于构件替换:只要保持接口一致,就可以将也便于构件替换:只要保持接口一致,就可以将某一层的软件替换掉,而不会影响到系统的其他某一层的软件替换掉,而不会影响到系统的其他部分。部分。(2 2)层次风格)层次风格n其他典型应用:开放系统互联(其他典型应用:开放系统互联(OSIOSI)七层网络模)七层网络模型、型、Windows NTWindows NT操作系统的内核结构。操作系统的内核结构。(2 2)层次风格)层次风格n其他说明:其他说明:优点是结构清晰、可替换性好、便于控制复杂优点是结构清晰、可替换性好、便于控制复杂性;性;但也有它的缺点,
13、如效率低:分层结构中高层但也有它的缺点,如效率低:分层结构中高层的数据要经过层层传递和转发,从而降低系统的数据要经过层层传递和转发,从而降低系统效率。效率。(3 3)客户)客户/服务器风格服务器风格n实例剖析:实例剖析:FTPFTP系统系统(3 3)客户)客户/服务器风格服务器风格n特征:从向外提供服务的构件出发,沿着连接关特征:从向外提供服务的构件出发,沿着连接关系递次搜索各构件和连接子,如果形成的拓扑结系递次搜索各构件和连接子,如果形成的拓扑结构是一棵倒置的树,那么这个系统的体系结构就构是一棵倒置的树,那么这个系统的体系结构就是客户是客户/服务器风格的。服务器风格的。n这种风格使得服务功能
14、的实现很集中,便于系统这种风格使得服务功能的实现很集中,便于系统实现,因而得到广泛使用。实现,因而得到广泛使用。(3 3)客户)客户/服务器风格服务器风格n其他典型应用:电子邮件系统、其他典型应用:电子邮件系统、WWWWWW系统、系统、TELNETTELNET系统、系统、CVSCVS版本控制系统等版本控制系统等数据库服务器可以向多个浏数据库服务器可以向多个浏览器实例提供服务、还可以览器实例提供服务、还可以向向CVS系统提供服务。系统提供服务。(3 3)客户)客户/服务器风格服务器风格n其他说明:在客户其他说明:在客户/服务器风格的系统中,服务器是资源服务器风格的系统中,服务器是资源和计算的集中
15、地,因此容易成为存储和计算瓶颈,实际应和计算的集中地,因此容易成为存储和计算瓶颈,实际应用中为了提高服务器的性能,可能要采用集群处理等办法用中为了提高服务器的性能,可能要采用集群处理等办法。同时,这个特点也使得这类系统容易遭受拒绝服务(。同时,这个特点也使得这类系统容易遭受拒绝服务(Deny Of ServiceDeny Of Service)攻击,因此在设计和应用中要作针对)攻击,因此在设计和应用中要作针对性考虑。性考虑。n此外,在这种风格的系统中,服务器中往往要存储更多客此外,在这种风格的系统中,服务器中往往要存储更多客户的状态信息,因此大量使用并发执行技术,如多进程、户的状态信息,因此大
16、量使用并发执行技术,如多进程、多线程等,这也就涉及到进程、线程的动态创建、调度、多线程等,这也就涉及到进程、线程的动态创建、调度、删除等问题。这些问题处理得好坏直接影响到服务器的性删除等问题。这些问题处理得好坏直接影响到服务器的性能。能。n文献文献7-27-2中描述了中描述了2323个设计模式,并将它们分为个设计模式,并将它们分为三种类型:创建型设计模式、结构型设计模式和三种类型:创建型设计模式、结构型设计模式和行为型设计模式。行为型设计模式。1.1.Factory MethodFactory Method(工厂方法)(工厂方法)2.2.Abstract FactoryAbstract Fac
17、tory(抽象工厂)(抽象工厂)3.3.SingletonSingleton(单件)(单件)4.4.CompositeComposite(组合)(组合)5.5.ProxyProxy(代理)(代理)6.6.IteratorIterator(迭代器)(迭代器)7.7.Observer Observer(观察者)(观察者)动机和实例、应用场合、结构、核心思想动机和实例、应用场合、结构、核心思想(1)Factory Method(1)Factory Methodn动机与实例:动机与实例:“龙珠龙珠”游戏游戏魔力管道:魔力管道:弹球(弹球(pop)制造球(制造球(Enchant)球球(1)Factory
18、 Method(1)Factory Methodn动机与实例:动机与实例:“龙珠龙珠”游戏游戏-设计设计1 1球有多种,如皮球、钢球球有多种,如皮球、钢球BallBall抽象父类抽象父类BallBall无法被实例化无法被实例化?(1)Factory Method(1)Factory Methodn动机与实例:动机与实例:“龙珠龙珠”游戏游戏-设计设计2 2new Ballnew Ball动作包装成虚函数动作包装成虚函数MakeBallFactoryMethodMakeBallFactoryMethod在子类(描述各种魔力管道)中重新定义该虚函数在子类(描述各种魔力管道)中重新定义该虚函数(1)
19、Factory Method(1)Factory Methodn适用场合:有一些实体(各种魔力管道),它们适用场合:有一些实体(各种魔力管道),它们的结构和行为是相似的,且都包含一些相似的更的结构和行为是相似的,且都包含一些相似的更小实体(各类球),但一个大实体内部的这些小小实体(各类球),但一个大实体内部的这些小实体都是同一类的(一种魔力管道内只有一种球实体都是同一类的(一种魔力管道内只有一种球)。此时,如果各类小实体的描述构成一个类层)。此时,如果各类小实体的描述构成一个类层次,那么可使用次,那么可使用Factory MethodFactory Method模式,将各类大模式,将各类大实体
20、也描述为一个类层次。实体也描述为一个类层次。(1)Factory Method(1)Factory Methodn结构:结构:(1)Factory Method(1)Factory Methodn核心思想归纳:在父类中,将创建对象的操作包核心思想归纳:在父类中,将创建对象的操作包装为一个虚函数,在描述公共行为的过程中调用装为一个虚函数,在描述公共行为的过程中调用该函数;在子类中重定义该虚函数来定制创建的该函数;在子类中重定义该虚函数来定制创建的对象,从而间接定制公共行为。利用虚函数的多对象,从而间接定制公共行为。利用虚函数的多态机制,态机制,Factory MethodFactory Meth
21、od模式使得父类可集中描模式使得父类可集中描述公共行为,而将特别行为(不同对象的创建)述公共行为,而将特别行为(不同对象的创建)抽放于子类。抽放于子类。(2)(2)Abstract FactoryAbstract Factoryn动机与实例:魔力管道。动机与实例:魔力管道。在前面的设计中,三个在前面的设计中,三个MakeBallFactoryMethodMakeBallFactoryMethod工厂方法散放在三个工厂方法散放在三个MagicPipeMagicPipe类中。为了降低复类中。为了降低复杂性,可以把所有的创建动作拆分出来单独考虑杂性,可以把所有的创建动作拆分出来单独考虑。即:创建球的
22、动作单独形成一个工厂类,专门创即:创建球的动作单独形成一个工厂类,专门创建对象。建对象。(2)(2)Abstract FactoryAbstract Factoryn动机与实例:设计动机与实例:设计3 3(2)(2)Abstract FactoryAbstract Factoryn动机与实例:设计动机与实例:设计4 4不仅有球、还有盒子等小实体,不仅有球、还有盒子等小实体,抽象工厂类专门创建各种小实体抽象工厂类专门创建各种小实体(2)(2)Abstract FactoryAbstract Factoryn动机与实例:设计动机与实例:设计5 5混合管道和小实体混合管道和小实体(2)(2)Abst
23、ract FactoryAbstract Factoryn适用场合:当需要创建一组多种风格的小实体、适用场合:当需要创建一组多种风格的小实体、且具体创建方式又要灵活可调整时,可使用且具体创建方式又要灵活可调整时,可使用Abstract FactoryAbstract Factory模式,将公共的创建行为描述模式,将公共的创建行为描述为一个抽象类,而将具体的创建方式用该抽象类为一个抽象类,而将具体的创建方式用该抽象类的子类来描述。的子类来描述。(2)(2)Abstract FactoryAbstract Factoryn结构:结构:(2)(2)Abstract FactoryAbstract F
24、actoryn核心思想归纳:为了提供灵活性,将需要创建的核心思想归纳:为了提供灵活性,将需要创建的同一风格的一组小实体的一般特征提取出来,用同一风格的一组小实体的一般特征提取出来,用一组抽象产品类来描述,同时将创建行为封装为一组抽象产品类来描述,同时将创建行为封装为一个抽象工厂类,提供通用的创建接口,而将各一个抽象工厂类,提供通用的创建接口,而将各种具体的产品和具体的创建行为用抽象产品类和种具体的产品和具体的创建行为用抽象产品类和抽象工厂类的子类来描述。从而使得抽象工厂类的子类来描述。从而使得BigEntityBigEntity和和具体的产品特性和具体的创建行为隔离开来,既具体的产品特性和具体
25、的创建行为隔离开来,既降低了耦合度,也使得灵活调整创建行为成为可降低了耦合度,也使得灵活调整创建行为成为可能。能。(3)(3)SingletonSingletonn动机与实例:日志功能,在一个应用程序内部一动机与实例:日志功能,在一个应用程序内部一般只需要一个日志实例即可。般只需要一个日志实例即可。实现方案实现方案1 1/log.h#include#include class Log public:Log();void Print(LPSTR format,.);void SetFile(LPSTR filename);virtual Log();private:公有的构造函数公有的构造函数(
26、3)(3)SingletonSingleton实现方案实现方案1 1全局变量全局变量(3)(3)SingletonSingletonn实现方案实现方案1 1/main.cpp#include log.hvoid main()g_log.SetFile(myapp.log);g_log.Print(App starts.);.需要日志的地方直接使用变量需要日志的地方直接使用变量g_log和相关接口函数和相关接口函数(3)(3)SingletonSingletonn实现方案实现方案1 1:两个缺陷:两个缺陷一般情况下(如果只有一个日志文件)一般情况下(如果只有一个日志文件)只需要一个只需要一个Lo
27、gLog实例即可,但上述做法不实例即可,但上述做法不能保证能保证LogLog的实例只有一个,当多个实例的实例只有一个,当多个实例设置相同的日志文件的时候,还可能引设置相同的日志文件的时候,还可能引起冲突;起冲突;这种做法使得这种做法使得g_logg_log无论用到与否都要被无论用到与否都要被创建。创建。(3)(3)SingletonSingletonn实现方案实现方案2 2:使用:使用SingletonSingleton模式模式私有静态成员变量,私有静态成员变量,代替全局变量,指向代替全局变量,指向log唯一实例唯一实例构造函数变为构造函数变为protected不可能在类外部创建实例不可能在类
28、外部创建实例静态私有函数代替全局变量,静态私有函数代替全局变量,获取实例指针获取实例指针(3)(3)SingletonSingletonn实现方案实现方案2 2:使用:使用SingletonSingleton模式模式#include“log.h”Log*log:theOnlyInstance=0;Log*Log:getInstance()If(!theOnlyInstance)theOnlyInstance=new Log();Return theOnlyInstance;初始化为初始化为0静态成员函数静态成员函数getInstance返回返回theOnlyInstance的值的值(3)(3)
29、SingletonSingletonn实现方案实现方案2 2:使用:使用SingletonSingleton模式模式#include“log.h”Void main()Log *plog=Log:getInstance();需要日志时,需要日志时,调用静态成员函数调用静态成员函数getInstance值值(3)(3)SingletonSingletonn适用场合:当需要确保一个类最多只有一个实例适用场合:当需要确保一个类最多只有一个实例时,使用本模式。时,使用本模式。(3)(3)SingletonSingletonn结构:设需要保证只有一个实例的类为结构:设需要保证只有一个实例的类为Singl
30、etonSingleton,则类,则类SingletonSingleton的定义为:的定义为:(3)(3)SingletonSingletonn结构:类结构:类SingletonSingleton的实现为:的实现为:(3)(3)SingletonSingletonn核心思想归纳:通过将一个类的构造函数设置为核心思想归纳:通过将一个类的构造函数设置为protectedprotected或或privateprivate,可有效阻止从外部直接创,可有效阻止从外部直接创建该类的实例;同时设置一个静态成员函数,以建该类的实例;同时设置一个静态成员函数,以负责创建唯一的实例并向外提供访问接口。负责创建唯一
31、的实例并向外提供访问接口。(4)(4)CompositeCompositen动机与实例:幻灯片制作软件。一张幻灯片上可动机与实例:幻灯片制作软件。一张幻灯片上可以有各种图元对象:文本框、图形、图像、影片以有各种图元对象:文本框、图形、图像、影片、声音等等。图元具有、声音等等。图元具有“递归组合递归组合”特性。特性。(4)(4)CompositeCompositen适用场合:当需要描述的对象具有适用场合:当需要描述的对象具有“递归组合递归组合”特征、且希望用户忽略基本对象与组合对象的区特征、且希望用户忽略基本对象与组合对象的区别时,适用本模式。别时,适用本模式。n结构:结构:(4)(4)Comp
32、ositeCompositen核心思想归纳:为基本对象和组合对象提供一个核心思想归纳:为基本对象和组合对象提供一个公共的抽象父类,以表示所有对象,并建立起从公共的抽象父类,以表示所有对象,并建立起从该抽象父类到组合对象类的聚集关联,从而间接该抽象父类到组合对象类的聚集关联,从而间接建立起建立起“递归组合递归组合”特性。特性。(5)(5)ProxyProxyn动机与实例:网络中间件。在这类程序中,实际工作的对动机与实例:网络中间件。在这类程序中,实际工作的对象可能运行在远程的主机上,与客户端应用分别处于不同象可能运行在远程的主机上,与客户端应用分别处于不同的地址空间。为了编程方便,在其中大量地使
33、用了的地址空间。为了编程方便,在其中大量地使用了ProxyProxy模式。建立一个模式。建立一个ProxyProxy对象:它与对象:它与ServerServer对象的接口是一对象的接口是一样的,而且与样的,而且与ClientClient对象位于同一台机器、同一地址空间对象位于同一台机器、同一地址空间中,所有发给它的操作请求最终都转发中,所有发给它的操作请求最终都转发ServerServer对象。给使对象。给使ClientClient对象的设计开发变得简单,就像本地编程一样,网对象的设计开发变得简单,就像本地编程一样,网络交互的许多细节则集中到络交互的许多细节则集中到ProxyProxy对象的实
34、现中。对象的实现中。(5)(5)ProxyProxyn适用场合:适用场合:1.1.前面的例子中使用前面的例子中使用ProxyProxy模式是为了屏蔽网络交互细模式是为了屏蔽网络交互细节、透明进行远程访问,因此属于节、透明进行远程访问,因此属于“远程代理远程代理”;2.2.还有一些场合是为了提高性能、降低开销,而设置一还有一些场合是为了提高性能、降低开销,而设置一个个“虚代理虚代理”,如文档文件中的图像代理,它只描述,如文档文件中的图像代理,它只描述图像的位置、大小等基本信息,具体图像文件细节仅图像的位置、大小等基本信息,具体图像文件细节仅在需要时再创建一个真正的图像对象来描述;在需要时再创建一
35、个真正的图像对象来描述;3.3.另外,当被访问对象的内部结构很复杂且需要进行智另外,当被访问对象的内部结构很复杂且需要进行智能的分析、决策和协调时,可使用能的分析、决策和协调时,可使用“智能代理智能代理”来屏来屏蔽这些智能决策的细节,如一个蔽这些智能决策的细节,如一个“订票订票”代理就是如代理就是如此:它可根据多家航空公司的订票服务,智能选择一此:它可根据多家航空公司的订票服务,智能选择一种符合用户要求的订票方案。种符合用户要求的订票方案。(5)(5)ProxyProxyn结构结构(5)(5)ProxyProxyn核心思想归纳:构造一个具有相同接口的代理核心思想归纳:构造一个具有相同接口的代理
36、对象,然后将操作请求转发给真实对象,其目对象,然后将操作请求转发给真实对象,其目的是向客户隐藏的是向客户隐藏“转发过程转发过程”的细节(如远程的细节(如远程网络交互、智能决策、选择性转发等),提供网络交互、智能决策、选择性转发等),提供对真实对象的透明访问。对真实对象的透明访问。(6)(6)IteratorIteratorn动机与实例:支持遍历的列表设计。动机与实例:支持遍历的列表设计。设计方案设计方案1 1void PrintList(List*pList)for(pList-First();!pList-IsDone();pList-Next()pList-CurrentItem()-Pr
37、int();内部迭代内部迭代外部迭代外部迭代(6)(6)IteratorIteratorn动机与实例:支持遍历的列表设计。动机与实例:支持遍历的列表设计。设计方案设计方案1 1的问题:的问题:1.1.其一,这种设计只能描述一种遍历方式,如向前遍历其一,这种设计只能描述一种遍历方式,如向前遍历或向后遍历,但不能同时描述多种遍历方式。或许,或向后遍历,但不能同时描述多种遍历方式。或许,大家觉得只需要再向大家觉得只需要再向ListList里面增加一些表示遍历的接里面增加一些表示遍历的接口函数和表示位置的成员变量即可,但这样一来众多口函数和表示位置的成员变量即可,但这样一来众多关系不紧密的功能混放在一
38、个类里,会使得内聚程度关系不紧密的功能混放在一个类里,会使得内聚程度变低,容易导致类膨胀,同时也给函数命名等带来不变低,容易导致类膨胀,同时也给函数命名等带来不便。便。2.2.其二,这种设计不支持在一个列表上同时进行多个相其二,这种设计不支持在一个列表上同时进行多个相同类型的遍历(如都是向后遍历,只是对元素的处理同类型的遍历(如都是向后遍历,只是对元素的处理方式不同),而这种情况可能出现在并行程序中。方式不同),而这种情况可能出现在并行程序中。(6)(6)IteratorIteratorn设计方案设计方案2 2:在一个列表上同时进行多个相同类型的遍历。在一个列表上同时进行多个相同类型的遍历。使
39、用使用IteratorIterator模式,将负责遍历的部分功能从模式,将负责遍历的部分功能从ListList中分离中分离出来,单独形成一个类出来,单独形成一个类ListIteratorListIterator(6)(6)IteratorIteratorn设计方案设计方案2 2:在一个列表上同时进行多个相同类型的遍历在一个列表上同时进行多个相同类型的遍历Class ListIteratorPrivate:const List *list;ListIterator增加指向原增加指向原列表的指针。因此,一列表的指针。因此,一个个ListIterator实例记录实例记录了与列表的一次遍历相了与列表的
40、一次遍历相关的所有信息,通过定关的所有信息,通过定义义ListIterator的多个实的多个实例变量,就可以在一个例变量,就可以在一个列表上同时进行多个相列表上同时进行多个相同类型的遍历。同类型的遍历。(6)(6)IteratorIteratorn设计方案设计方案3 3:以多种方式遍历一个列表,再定义一个迭代器类型以多种方式遍历一个列表,再定义一个迭代器类型List*aList;.ListIterator forward(aList);ReverseListIterator backward(aList);for(forward.First();!forward.IsDone();forwar
41、d.Next()forward.CurrentItem()-Print();for(backward.First();!backward.IsDone();backward.Next()backward.CurrentItem()-Print();(6)(6)IteratorIteratorn适用场合:当需要以多种方式灵活地遍历一个聚适用场合:当需要以多种方式灵活地遍历一个聚合对象中的各个元素时,适用本模式。合对象中的各个元素时,适用本模式。n结构:结构:(6)(6)IteratorIteratorn核心思想归纳:通过将与遍历有关的部分从聚合核心思想归纳:通过将与遍历有关的部分从聚合对象的描述
42、中分离出来、单独成类,能够将遍历对象的描述中分离出来、单独成类,能够将遍历的状态信息用一个独立对象记录,从而可有效处的状态信息用一个独立对象记录,从而可有效处理多种遍历和并发遍历。另外,本模式可与理多种遍历和并发遍历。另外,本模式可与Factory MethodFactory Method模式配合使用,支持从聚合对象模式配合使用,支持从聚合对象直接创建相应的聚合器。直接创建相应的聚合器。(7)(7)ObserverObservern动机与实例:动机与实例:WordWord软件的软件的“窗口拆分窗口拆分”功能。功能。(7)(7)ObserverObservern动机与实例:动机与实例:WordW
43、ord软件的软件的“窗口拆分窗口拆分”功能。功能。(7)(7)ObserverObservern动机与实例:动机与实例:WordWord软件的软件的“窗口拆分窗口拆分”功能。功能。(7)(7)ObserverObservern动机与实例:动机与实例:WordWord软件的软件的“窗口拆分窗口拆分”功能。功能。class Document;class Window public:void Update();Window(Document*d)doc=d;doc-Attach(this);Window()doc-Detach(this);private:(7)(7)ObserverObserver
44、n适用场合:如果对象之间存在一对多的数据依赖关系、适用场合:如果对象之间存在一对多的数据依赖关系、且当被依赖对象的数据改变时所有依赖于它的对象都应且当被依赖对象的数据改变时所有依赖于它的对象都应得到通知并自动更新,那么可使用本模式。被依赖的对得到通知并自动更新,那么可使用本模式。被依赖的对象称为发布者,负责发布数据并通知所有的订阅者(即象称为发布者,负责发布数据并通知所有的订阅者(即依赖于该发布者的对象),以便订阅者与发布者的状态依赖于该发布者的对象),以便订阅者与发布者的状态保持一致。保持一致。n前面的例子中,前面的例子中,DocumentDocument对象为发布者,而对象为发布者,而Wi
45、ndowWindow对象对象为订阅者。因此,本模式也称为发布为订阅者。因此,本模式也称为发布-订阅(订阅(Publish-Publish-SubscribeSubscribe)模式。订阅者也可称为观察者()模式。订阅者也可称为观察者(ObserverObserver),它似乎在时刻观察发布者的状态,并及时更新自己),它似乎在时刻观察发布者的状态,并及时更新自己。(7)(7)ObserverObservern结构:结构:(7)(7)ObserverObservern核心思想归纳:对象是对数据和函数的封装,核心思想归纳:对象是对数据和函数的封装,当一个类包含了太多的函数(或称操作)时,当一个类包含
46、了太多的函数(或称操作)时,我们倾向于将其拆分为多个相互协作的类,每我们倾向于将其拆分为多个相互协作的类,每个协作类描述一部分行为、包含原来的一部分个协作类描述一部分行为、包含原来的一部分数据和函数,但这种拆分有一个副作用:因为数据和函数,但这种拆分有一个副作用:因为各协作对象很可能会共享部分数据,所以需要各协作对象很可能会共享部分数据,所以需要维护相关对象在数据上的一致性。通过使用维护相关对象在数据上的一致性。通过使用ObserverObserver模式,能够为相关对象制定一个交互模式,能够为相关对象制定一个交互协议,专门用作数据的一致性维护。协议,专门用作数据的一致性维护。精品课件!精品课件!
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。