设计模式浅谈种幻灯片.ppt

上传人:石*** 文档编号:87634522 上传时间:2023-04-16 格式:PPT 页数:140 大小:4.79MB
返回 下载 相关 举报
设计模式浅谈种幻灯片.ppt_第1页
第1页 / 共140页
设计模式浅谈种幻灯片.ppt_第2页
第2页 / 共140页
点击查看更多>>
资源描述

《设计模式浅谈种幻灯片.ppt》由会员分享,可在线阅读,更多相关《设计模式浅谈种幻灯片.ppt(140页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、设计模式浅谈种设计模式浅谈种第1页,共140页,编辑于2022年,星期二准备准备理解面向对象设计的理解面向对象设计的原则原则n开放开放-封闭原则:封闭原则:是说软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。n里氏代换原则:里氏代换原则:子类型必须能够替换掉它们的父类型。n依赖倒转原则:依赖倒转原则:A.高层模块不应该依赖低层模块。两个都应该依赖抽象。B.抽象不应该依赖细节。细节应该依赖抽象。n请参考面向对象设计的原则2第2页,共140页,编辑于2022年,星期二概述概述n导致重新设计的一般原因q通过显式指定一个类来创建对象q对特殊操作的依赖q对硬件和软件平台的依赖q对对象表示和实现

2、的依赖q对算法的依赖q紧耦合q通过生成子类来扩充功能q不能方便地对类进行修改3第3页,共140页,编辑于2022年,星期二概述概述4原则一:对接口编程,而不是对实现编程原则一:对接口编程,而不是对实现编程原则二:优先使用对象组合,而不是继承原则二:优先使用对象组合,而不是继承第4页,共140页,编辑于2022年,星期二概述概述n什么是设计模式q设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。q每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。n设计模式的内容q模式名称 Pattern na

3、meq问题 Problemq解决方案 Solutionq效果 Consequences5第5页,共140页,编辑于2022年,星期二概述概述n设计模式编目范围范围目的目的创建型创建型结构型结构型行为型行为型类类Factory MethodAdapterInterpreterTemplate Method对象对象Abstract FactoryBuilderPrototypeSingletonAdapterBridgeCompositeDecoratorFacadeFlyweightProxyChain of ResponsibilityCommandIteratorMediatorMement

4、oObserverStateStrategyVisitor第6页,共140页,编辑于2022年,星期二设设计计模模式式之之间间的的关关系系7第7页,共140页,编辑于2022年,星期二创建型模式创建型模式n创建型模式的目的q使系统独立于如何创建、组合和表示对象。q类创建型模式使用继承改变被实例化的类。q对象创建型模式将实例化委托给另一个对象。8Abstract FactoryBuilderFactory MethodPrototypeSingleton第8页,共140页,编辑于2022年,星期二创建型模式创建型模式三种Factory模式:nSimpleFactory(简单工厂)模式(简单工厂)

5、模式:专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。nFactoryMethod(工厂方法)模式(工厂方法)模式:将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数,究竟应该创建何种对象由具体的子类负责决定。nAbstractFactory(抽象工厂)模式(抽象工厂)模式:提供一个共同的接口来创建相互关联的多个对象。9第9页,共140页,编辑于2022年,星期二创建型模式创建型模式nFactory Method(工厂方法)q类创建型模式q意图n定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

6、q适用性n当一个类不知道它所必须创建的对象的类的时候。n当一个类希望由它的子类来指定它所创建的对象的时候。n当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。10第10页,共140页,编辑于2022年,星期二创建型模式创建型模式nFactory Method(工厂方法)11第11页,共140页,编辑于2022年,星期二创建型模式创建型模式nFactory Method(工厂方法)q效果n用工厂方法在类中创建对象比直接创建更灵活,子类可以提供对象的扩展版本。n连接平行的类层次,将哪些类应一同工作的信息局部化。q实现nCreator可以只声明

7、工厂方法,也可以提供缺省的实现。n可以使用模板以避免创建子类。n可采用适当的命名约定说明正在使用工厂方法。12第12页,共140页,编辑于2022年,星期二创建型模式创建型模式nAbstract Factory(抽象工厂)q对象创建型模式q意图n提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。q适用性n一个系统要独立于它的产品的创建、组合和表示时。n一个系统要用多个产品系列中的一个来配置时。n要强调一系列相关的产品对象的设计以便进行联合使用时。n提供一个产品类库,而只想显示它们的接口而不是实现时。13第13页,共140页,编辑于2022年,星期二创建型模式创建型模式nAbs

8、tract Factory(抽象工厂)14第14页,共140页,编辑于2022年,星期二创建型模式创建型模式15第15页,共140页,编辑于2022年,星期二创建型模式创建型模式nAbstract Factory(抽象工厂)q效果n由工厂封装产品对象的创建,将客户与类的实现分离。n易于交换产品系列。n有利于产品的一致性。n难以支持新种类的产品。q实现n通常可以将工厂作为Singleton。nAbstract Factory声明创建产品的接口,由工厂子类负责创建产品,通常为每个产品定义一个工厂方法。n一种更灵活但不太安全的设计是以参数方式创建对象。16第16页,共140页,编辑于2022年,星期

9、二创建型模式创建型模式nBuilder(生成器)q对象创建型模式q意图n将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。q适用性n当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。n当构造过程必须允许被构造的对象有不同的表示时。17第17页,共140页,编辑于2022年,星期二创建型模式创建型模式nBuilder(生成器)18第18页,共140页,编辑于2022年,星期二创建型模式创建型模式四个角色:n建造者(建造者(Builder)角色:)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直

10、接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。求的方法:一个是建造方法,另一个是结果返还方法。n具体建造者(具体建造者(ConcreteBuilder)角色:)角色:担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括:q实现Builder角色提供的接口,一步一步完成创建产品实例的过程。q在建造过程完成后,提供产品的实例。19第19页,共140页,编辑于2022年,星期二创建型模式创建型模式n指导者(指导者(Dir

11、ector)角色:)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。n产品(产品(Product)角色:)角色:产品便是建造中的复杂对象。n指导者角色是于客户端打交道的角色。导演者角色将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但却不为客户端所知。20第20页,共140页,编辑于2022年,星期二创建型模式创建型模式nBuilder(生成器)21class Builder /创建部件创建部件A比如创建汽车车轮比如创建汽车车轮void bui

12、ldPartA();/创建部件创建部件B 比如创建汽车方向盘比如创建汽车方向盘void buildPartB();/创建部件创建部件C 比如创建汽车发动机比如创建汽车发动机void buildPartC();/返回最后组装成品结果返回最后组装成品结果(返回最后装配好的汽车返回最后装配好的汽车)/成品的组装过程不在这里进行成品的组装过程不在这里进行,而是转移到下面的而是转移到下面的Director类中进行类中进行./从而实现了解耦从而实现了解耦过程过程和和部件部件Product*getResult();class Director private Builder*m_builder;public

13、 Director(Builder*builder)m_builder=builder;/将部件将部件partA partB partC最后组成复杂对象最后组成复杂对象/这里是将车轮这里是将车轮 方向盘和发动机组装成汽车的过程方向盘和发动机组装成汽车的过程public void construct()builder-buildPartA();builder-buildPartB();builder-buildPartC();class ConcreteBuilder:public Builder Part partA,partB,partC;public:void buildPartA()/这

14、里是具体如何构建这里是具体如何构建partA的代码的代码 void buildPartB()/这里是具体如何构建这里是具体如何构建partB的代码的代码 void buildPartC()/这里是具体如何构建这里是具体如何构建partB的代码的代码 Product*getResult()/返回最后组装成品结果返回最后组装成品结果;ConcreteBuilder builder;Director director(&builder);director.construct();Product*product=builder.getResult();第21页,共140页,编辑于2022年,星期二创建

15、型模式创建型模式nBuilder(生成器)q效果n可以改变一个产品的内部表示。n将构造代码和表示代码分开。n可以对构造过程进行更精细的控制。q实现nBuilder类接口应足够普遍。n产品通常不需要有公共抽象类。nBuilder中通常缺省方法为空。22第22页,共140页,编辑于2022年,星期二创建型模式创建型模式nPrototype(原型)q对象创建型模式q意图n用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。q适用性n当要实例化的类是在运行时刻指定时,例如,通过动态装载;n或者为了避免创建一个与产品类层次平行的工厂类层次时;n或者当一个类的实例只能有几个不同状态组合中的一种

16、时。n建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。23第23页,共140页,编辑于2022年,星期二创建型模式创建型模式nPrototype(原型)24第24页,共140页,编辑于2022年,星期二创建型模式创建型模式n客户(客户(Client)角色:)角色:客户类提出创建对象的请求。n抽象原型(抽象原型(Prototype)角色:)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。n具体原型(具体原型(ConcretePrototype)角色:)角色:被复制的对象。此角色需要实现抽象原型角色所要求的接口。25第25页,共

17、140页,编辑于2022年,星期二创建型模式创建型模式nPrototype(原型)q效果n可在运行时刻增加和删除产品。n可以通过改变值来指定新产品。n可以通过改变结构来指定新对象。n减少了子类的构造。n可以用类动态配置应用。q实现n使用一个原型管理器;n实现克隆操作(浅拷贝和深拷贝);n初始化克隆对象;q参考阎宏的JAVA模式26第26页,共140页,编辑于2022年,星期二创建型模式创建型模式nSingleton(单件)q对象创建型模式q意图n保证一个类仅有一个实例,并提供一个访问它的全局访问点。q适用性n当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。n当这个唯一实例应该是通

18、过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。27第27页,共140页,编辑于2022年,星期二创建型模式创建型模式nSingleton(单件)28实例详解实例详解第28页,共140页,编辑于2022年,星期二结构型模式结构型模式n结构型模式的目的q结构型模式涉及到如何组合类和对象以获得更大的结构。q结构型类模式采用继承机制来组合接口或实现。q结构型对象模式描述了如何对一些对象进行组合实现新功能,并可以在运行时刻改变对象组合关系的一些方法。29AdapterBridgeCompositeDecoratorFacadeFlyweightProxy第29页,共140页,编辑于

19、2022年,星期二结构型模式结构型模式nAdapter(适配器)q类/对象结构型模式q意图n将一个类的接口一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。q适用性n你想使用一个已经存在的类,而它的接口不符合你的需求。n你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。n(仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。30第30页,共140页,编辑于2022年,星期二结构型模式结构型模式角色:n目标(

20、目标(Target)角色:)角色:这是客户所期待的接口。因为C#不支持多继承,所以Target必须是接口,不可以是类。n源(源(Adaptee)角色:)角色:需要适配的类。n适配器(适配器(Adapter)角色:)角色:把源接口转换成目标接口。根据这一角色的实现不同,可分为类适配器和对象适配器。31第31页,共140页,编辑于2022年,星期二结构型模式结构型模式Adapter(类适配器)n类适配器类适配器是通过继承类适配者类(继承类适配者类(AdapteeClass)实现的,另外类适配器实现客户类所需要的接口。当客户对象调用适配器类方法的时候,适配器内部调用它所继承的适配者的方法。32第32

21、页,共140页,编辑于2022年,星期二结构型模式结构型模式Adapter(对象适配器)n对象适配器对象适配器包含一个适配器者的引用(包含一个适配器者的引用(reference),),与类适配器相同,对象适配器也实现了客户类需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。33n实例详解实例详解第33页,共140页,编辑于2022年,星期二结构型模式结构型模式nBridge(桥接)q对象结构型模式q意图n将抽象部分与它的实现部分分离将抽象部分与它的实现部分分离,使它们都可以独立地变化。通过动态的结合实现解耦(GOF).n比如说通过JDBC访问数据库

22、访问数据库,我们操作的API是基于接口的,是抽象,没有实现。而特定数据库提供的驱动测试抽象方法的具体实现。q适用性34第34页,共140页,编辑于2022年,星期二结构型模式结构型模式nBridge(桥接)q对象结构型模式q意图q适用性n不希望在抽象和它的实现部分之间有一个固定的绑定关系。n类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。n对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。n你想对客户完全隐藏抽象的实现部分。n有许多子类要生成。这样一种类层次结构说明你必须将一个对象分解成两个部分。n你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不

23、知道这一点。35第35页,共140页,编辑于2022年,星期二结构型模式结构型模式nBridge(桥接)36第36页,共140页,编辑于2022年,星期二结构型模式结构型模式角色:n抽象化抽象化(Abstraction)角色:角色:抽象化给出的定义,并保存一个对实现化对象的引用。n修正抽象化修正抽象化(RefinedAbstraction)角色:角色:扩展抽象化角色,改变和修正父类对抽象化的定义。n实现化实现化(Implementor)角色:角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角

24、色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。n具体实现化具体实现化(ConcreteImplementor)角色:角色:这个角色给出实现化角色接口的具体实现。37第37页,共140页,编辑于2022年,星期二结构型模式结构型模式nBridge(桥接)q效果n分离了接口及其实现部分。n提高了可扩充性。n实现了细节对客户透明。q实现n当仅有一个Implementor时不须创建抽象Implementor。n如何创建正确的Implementor对象。n共享Implementor对象。38第38页,共140页,编辑于2022年,星期二结构型模式结构型模式nComposite

25、(组合)q对象结构型模式q意图n将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。q适用性n你想表示对象的部分-整体层次结构。n你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。20142014年年9 9月月2929日日2222时时4040分分39第39页,共140页,编辑于2022年,星期二结构型模式结构型模式nComposite(组合)40第40页,共140页,编辑于2022年,星期二结构型模式结构型模式角色:n抽象构件(抽象构件(Component)角色:)角色:这是一个抽象角色,它给参与组合的

26、对象规定一个接口。这个角色给出共有接口及其默认行为。n树叶构件(树叶构件(Leaf)角色:)角色:代表参加组合的树叶对象。一个树叶对象没有下级子对象。n树枝构件(树枝构件(Composite)角色:)角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。可以看出,Composite类型的对象可以包含其它Component类型的对象。换而言之,Composite类型对象可以含有其它的树枝(Composite)类型或树叶(Leaf)类型的对象。41第41页,共140页,编辑于2022年,星期二结构型模式结构型模式nDecorator(装饰),又名包装(Wrapper)模式q对象结构型模式q

27、意图n动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。q适用性42第42页,共140页,编辑于2022年,星期二结构型模式结构型模式nDecorator(装饰)q对象结构型模式q意图q适用性n在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。n处理那些可以撤消的职责。n当不能采用生成子类的方法进行扩充时当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。43第43页,共140页,编辑于2022年,

28、星期二结构型模式结构型模式nDecorator(装饰)44第44页,共140页,编辑于2022年,星期二结构型模式结构型模式角色有:n抽象构件(抽象构件(Component)角色:)角色:给出一个抽象接口,以规范准备接收附加责任的对象。n具体构件(具体构件(ConcreteComponent)角色:)角色:定义一个将要接收附加责任的类。n装饰(装饰(Decorator)角色:)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。n具体装饰(具体装饰(ConcreteDecorator)角色:)角色:负责给构件对象贴上附加的责任。45第45页,共140页,编辑

29、于2022年,星期二结构型模式结构型模式n孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领。他变成鱼儿时,就可以到水里游泳;他变成雀儿时,就可以在天上飞行。而不管悟空怎么变化,在二郎神眼里,他永远是那只猢狲。n装饰模式以对客户透明的方式动态地给一个对象附加上更多的装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任。责任。换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展。46第46页,共140页,编辑于2022年,星期二结构型模式结构型模式n装饰模式使用原来被装饰的类的一个子类的实例,把客户端的调用委派到被

30、装饰类。装饰模式的关键在于这种扩展是完全透明的。n在孙猴子的例子里,老孙变成的鱼儿相当于老孙的子类,这条鱼儿与外界的互动要通过“委派”,交给老孙的本尊,由老孙本尊采取行动。47第47页,共140页,编辑于2022年,星期二结构型模式结构型模式nDecorator(装饰)48第48页,共140页,编辑于2022年,星期二结构型模式结构型模式nDecorator(装饰)q效果nDecorator比静态继承更灵活;nDecorator避免在层次结构高层的类中有太多的特征;nDecorator不等同于它所装饰的对象;n可能产生很多小对象;q实现n装饰对象应与被装饰组件保持一致的接口,即组件的所有装饰实

31、现类拥有相同的父类;n当只有一个装饰实现类时,可省略装饰抽象类;n组件与装饰拥有相同父类,应保持该父类的简单性;n装饰可以用于改变组件的外观,而不能改变组件的内核;49第49页,共140页,编辑于2022年,星期二结构型模式结构型模式nDecorator(装饰)50第50页,共140页,编辑于2022年,星期二结构型模式结构型模式nFacade(外观)q对象结构型模式q意图n为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。q适用性51第51页,共140页,编辑于2022年,星期二结构型模式结构型模式nFacade(外观)q对象结构

32、型模式q意图q适用性n为一个复杂子系统提供一个简单接口,需要更多的可定制性的用户可以越过Facade层。n当客户程序与抽象类的实现部分之间存在着很大的依赖性时,引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。n在构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。让相互依赖的子系统之间仅通过Facade进行通讯,可以简化它们之间的依赖关系。52第52页,共140页,编辑于2022年,星期二结构型模式结构型模式nFacade(外观)53第53页,共140页,编辑于2022年,星期二结构型模式结构型模式两个角色:n门面门面(Facad

33、e)角色:角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。n子系统子系统(subsystem)角色:角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。54第54页,共140页,编辑于2022年,星期二结构型模式结构型模式nFacade(外观)55第55页,共140页,编辑于2022年,星期二结构型模式结构型模式nFacade(

34、外观)56第56页,共140页,编辑于2022年,星期二结构型模式结构型模式nFlyweight(享元)q对象结构型模式q意图n运用共享技术有效地支持大量细粒度的对象。q适用性57第57页,共140页,编辑于2022年,星期二结构型模式结构型模式nFlyweight(享元)q对象结构型模式q意图q适用性n应用程序使用了大量的对象,造成很大的存储开销。n对象的大多数状态都可变为外部状态。n如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。n应用程序不依赖于对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。58第58页,共140页,编辑

35、于2022年,星期二结构型模式结构型模式n享元模式以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内蕴状态(内蕴状态(InternalState)和外蕴状态外蕴状态(ExternalState)。n内蕴状态内蕴状态是存储在享元对象内部并且不会随环境改变而改变。因此内蕴状态并可以共享。n外蕴状态外蕴状态是随环境改变而改变的、不可以共享的状态。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态与内蕴状态是相互独立的。59第59页,共140页,编辑于2022年,星期二结构型模式结构型模式nFlyweight(享元)60第6

36、0页,共140页,编辑于2022年,星期二结构型模式结构型模式角色如下:n抽象享元抽象享元(Flyweight)角色:角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口。那些需要外蕴状态(External State)的操作可以通过调用商业方法以参数形式传入。n具体享元具体享元(ConcreteFlyweight)角色:角色:实现抽象享元角色所规定的接口。如果有内蕴状态的话,必须负责为内蕴状态提供存储空间。享元对象的内蕴状态必须与对象所处的周围环境无关,从而使得享元对象可以在系统内共享的。61第61页,共140页,编辑于2022年,星期二结构型模式结构型模式n复合享元复合享

37、元(UnsharableFlyweight)角色:角色:复合享元角色所代表的对象是不可以共享的,但是一个复合享元对象可以分解成为多个本身是单纯享元对象的组合。复合享元角色又称做不可共享的享元对象。62第62页,共140页,编辑于2022年,星期二结构型模式结构型模式n享元工厂享元工厂(FlyweightFactory)角色:角色:本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个复合要求的享元对象。如果已经有了,享元工厂角色就应当提供这个已有的享元对象;如果系统中没有一个适当的享元对象的话,享

38、元工厂角色就应当创建一个合适的享元对象。n客户端客户端(Client)角色:角色:本角色需要维护一个对所有享元对象的引用。本角色需要自行存储所有享元对象的外蕴状态。63第63页,共140页,编辑于2022年,星期二结构型模式结构型模式享元模式的应用享元模式的应用n享元模式在编辑器系统中大量使用。一个文本编辑器往往会提供很多种字体,而通常的做法就是将每一个字母做成一个享元对象。享元对象的内蕴状态就是这 个字母,而字母在文本中的位置和字模风格等其他信息则是外蕴状态。比如,字母a可能出现在文本的很多地方,虽然这些字母a的位置和字模风格不同,但是所有 这些地方使用的都是同一个字母对象。这样一来,字母对

39、象就可以在整个系统中共享。64第64页,共140页,编辑于2022年,星期二结构型模式结构型模式nFlyweight(享元)65第65页,共140页,编辑于2022年,星期二结构型模式结构型模式n享元模式的优点和缺点享元模式的优点和缺点n享元模式的优点在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的:q享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。q享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。66第66页,共140页,编辑于2022年,星期二结构型模式结构型模式nProxy(代理)q对象结构型模式

40、q意图n为其他对象提供一种代理以控制对这个对象的访问。q适用性n在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。67第67页,共140页,编辑于2022年,星期二结构型模式结构型模式代理的种类代理的种类如果按照使用目的来划分,可分为:如果按照使用目的来划分,可分为:n远程(远程(Remote)代理:)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。n虚拟(虚拟(Virtual)代理:)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创

41、建。nCopy-on-Write代理:代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。nCache代理:代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。68第68页,共140页,编辑于2022年,星期二结构型模式结构型模式n保护(保护(ProtectorAccess)代理:)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。n防火墙(防火墙(Firewall)代理:)代理:保护目标,不让恶意用户接近。n同步化(同步化(Synchronization)代理:)代理:使几个用户能够同时使用一个对象而没有冲突。

42、n智能引用(智能引用(SmartReference)代理:)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。69第69页,共140页,编辑于2022年,星期二结构型模式结构型模式nProxy(代理)70第70页,共140页,编辑于2022年,星期二结构型模式结构型模式角色:n抽象主题角色(抽象主题角色(Subject):):声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题。n真实主题角色(真实主题角色(RealSubject)角色:)角色:定义了代理角色所代表的真实对象。71第71页,共140页,编辑于2022年,星期二结

43、构型模式结构型模式角色:n代理主题(代理主题(Proxy)角色:)角色:代理主题角色内部含有对真是主题的引用,从而可以在任何 时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主体;控制真实主题的应用,负责在需要的时候创 建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯的将调用传递给真实主题对 象。72第72页,共140页,编辑于2022年,星期二结构型模式结构型模式nProxy(代理)73第73页,共140页,编辑于2022年,星期二结构型模式结构型模式n结构型模式的讨论

44、qAdapter和Bridge都涉及到从自身以外的接口向另一对象发送请求,Adapter是为了解决两个接口不匹配,Bridge则是对抽象接口与其实现部分进行桥接。Adapter通常在类设计好之后实施,Bridge则在类设计之前实施。qAdapter使两个已经存在的接口协同工作,并不定义新的接口,而Facade则定义了一个新的接口。qComposite和Decorator都是基于递归组合来组织可变数目的对象,但Composite的目的是使多个相关对象能够被当作一个对象来处理,Decorator的目的则是不需要生成子类即可给对象添加职责。qDecorator和Proxy都描述了为对象提供间接引用,

45、但Proxy不能动态地添加或分离性质,也不是为递归组合而设计的,是由实体完成关键功能,Proxy控制其访问,而Decorator则是在组件基本功能之外完成附加的功能。74第74页,共140页,编辑于2022年,星期二行为模式行为模式n行为模式的目的q行为模式涉及到算法和对象间职责的分配。q行为模式描述对象或类之间的通信模式,刻画了在运行时难以跟踪的复杂的控制流。75Chain of ResponsibilityObserverCommandInterpreterIteratorMediatorMementoStateStrategyTemplate MethodVisitor第75页,共140

46、页,编辑于2022年,星期二行为模式行为模式nChain of Responsibility(响应链)q对象行为模式q意图n使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。q适用性76第76页,共140页,编辑于2022年,星期二行为模式行为模式nChain of Responsibility(响应链)q对象行为模式q意图q适用性n有多个对象可以处理一个请求,哪个对象处理该请求在运行时刻自动确定。n在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。n可处理一个请求的对象集合应被动态指定。7

47、7第77页,共140页,编辑于2022年,星期二行为模式行为模式n击鼓传花击鼓传花n击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正。开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒。n击鼓传花便是责任链模式的应用。责任链可能是一条直线、一个环链或者一个树结构的一部分。78第78页,共140页,编辑于2022年,星期二行为模式行为模式nChain of Responsibility(响应链)79第79页,共140页,编辑于2022年,星期二行为模式行为模式角色如下:n抽象处理者抽象处理者(Handl

48、er)角色:角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。n具体处理者具体处理者(ConcreteHandler)角色:角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。80第80页,共140页,编辑于2022年,星期二行为模式行为模式nChain of Reponsibility(响应链)81第81页,共140页,编辑于2022年,星期二行为模式行为模式nChain of Reponsibility(响应链)q效果n降低

49、了对象间的耦合度。n增强了给对象分配响应(职责)的灵活性。n不保证请求被响应。q实现n后续链的实现n请求的表示:硬编码方式或请求码方式82第82页,共140页,编辑于2022年,星期二行为模式行为模式nCommand(命令)q对象行为模式q意图n将一个请求封装为一个对象请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;n对请求排队或记录请求日志,以及支持可撤消的操作。q适用性83第83页,共140页,编辑于2022年,星期二行为模式行为模式nCommand(命令)q对象行为模式q意图q适用性n抽象出待执行的动作以参数化某对象。Command模式是回调机制的一个面向对象的替代品。n在不

50、同的时刻指定、排列和执行请求。n支持取消操作。n支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。n用构建在原语操作上的高层操作构造一个系统。84第84页,共140页,编辑于2022年,星期二行为模式行为模式nCommand(命令)85第85页,共140页,编辑于2022年,星期二行为模式行为模式角色:n客户(客户(Client)角色:)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。n命令(命令(Command)角色:)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色。n具体命令(具体命令(ConcreteCommand)角色:)角色:定义一个

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁