设计模式总结-装饰都模式.docx_第1页
设计模式总结-装饰都模式.docx_第2页
设计模式总结-装饰都模式.docx_第3页
设计模式总结-装饰都模式.docx_第4页
设计模式总结-装饰都模式.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

注:文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。使用非继承方式动态的给一个对像增加功能,这种方式在程序运行阶段才动态为其增加功能,故非常灵活。特点:1. 装饰者和被装饰者拥有共同的超类。2. 装饰者有一个成员变量,指向被装饰者实例。被装饰者实例以参数形式传入装饰者。3. 执行时动态决定被装饰对像,比使用继承方式更加灵活。=要点:1. 特点和本质: 动态的给一个对像增加功能。2. 应用场景:3. C+/JAVA实现装饰者模式定义:动态的给一个对像增加其它职责(Responsibility)。就增加对像功能来说,装饰者比生成子实现类更加灵活。装饰者模式,也叫包装器(Wrapper)模式。它的主要用途,是在不改变一个类的代码、也不改变它的继承体系的前提下,为这个类增加功能。当你可能想为一个类增加更多功能时,使用装饰者模式意味着你的新版本的代码不必通过继承这个类来重用现有的功能。在动态的增加功能时,为什么装饰者模式比生成子类更加灵活?我想这是因为 被装饰者 是在装饰者实例产生的时候动态的以参数的方式传给装饰者的,而继承是在编译阶段就已经确定,而以聚合的方式在运行时动态进行扩展当然也就更加灵活。装饰者提供了比继承更有弹性的替代方案。(配合JAVA IO API一起理解)装饰者模式分类:读书笔记之设计模式2012-02-03 18:21221人阅读评论(0)收藏举报利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都继承到相同的行为。然而,如果能够利用聚合的做法扩展对象的行为(通过参数的方式把被装饰者传给装饰者),就可以在运行时动态地进行扩展。通过动态地组合对象,可以写新的代码添加新功能,而无须修改现有代码。既然没有改变现有代码,那么引进bug或产生意外副作用的机会将大幅度减少。设计原则类应该对扩展开发,对修改关闭。装饰者模式动态地将责任附加到对象上。若需要扩展功能,装饰者提供了比继承更有弹性的替代方案。装饰者和被装饰者必须是一样的类型,也就是有共同的超类,这是相当关键的地方。在这里,我们利用继承达到了“类型匹配”,而不是利用继承获得“行为”。当我们将装饰者和组件组合时,就是在加入新的行为(这里虽然没有新的方法,比如星巴克中的cost方法)。所得到的新的行为,并不是继承自超类,而是由组合对象得到的。我个人的理解觉得有点利用超类型同样来递归调用的意思。比如在上面的图中,ConcreteDecoratorA有一个Component类型的ConcreteComponent实例,这个实例是在ConcreteDecoratorA实例的创建时候以参数传给构造函数的。然后再在ConcreteDecoratorA中增加功能。比如:DataInputStream(InputStreamin)Creates aDataInputStreamthat uses the specified underlying InputStream.DataInputStream在实例化的时候必须以一个InputStream实例为参数,而InputStream实例就是所谓的被装饰者了,而DataInputStream就是装饰者java设计中很经典的装饰者模型,java.io类。细说下java的io设计Java I/O库具有两个对称性,它们分别是:输入输出对称性,比如InputStream和OutputStream各自占据Byte流的输入与输出的两个平行的等级结构的根部。而Reader和Writer各自占据Char流的输入与输出的两个平行的等级结构的根部。byte-char对称,InputStream和Reader的子类分别负责Byte和Char流的输入;OutputStream和Writer的子类分别负责Byte和Char流的输出,它们分别形成平行的等级结构。Java I/O库的两个设计模式:Java的I/O库总体设计是符合装饰者模式(Decorator)跟适配器模式(Adapter)的。如前所述,这个库中处理流的类叫做流类。引子里所谈到的FileInputStream,FileOutputStream,DataInputStream及DataOutputStream都是流处理器的例子。装饰者模式:在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的,具有改善了的功能的流处理器。装饰者模式是Java I/O库的整体设计模式。这样的一个原则是符合装饰者模式的。适配器模式:在由InputStream,OutputStream,Reader和Writer代表的等级结构内部,有一些流处理器是对其它类型的流源的适配。这就是适配器模式的应用,如下图所示。由于装饰模式的引用,造成了灵活性和复杂都大大增加了,我们在使用Java I/O库时,必须理解Java I/O库是由一些基本的原始流处理器和围绕它们的装饰流处理器所组成的,这样可以在学习和使用Java I/O库时达到事半功倍的效果。首先是InputStream类型中的装饰模式:InputStream有七个直接的具体子类,有四个属于FilterInputStream的具体子类,如下图所示:原始流处理器原始流处理器接收一个Byte数组对象,String对象,FileDiscriptor对象或者不同类型的流源对象,根据上面的图,原始流处理器包括以下四种:ByteArrayInputStream:为多线程的通信提供缓冲区操作功能,接收一个Byte数组作为流的源。FileInputStream:建立一个与文件有关的输入流。接收一个File对象作为流的源。PipedInputStream:可以与PipedOutputStream配合使用,用于读入一个数据管道的数据,接收一个PipedOutputStream作为源。StringBufferInputStream:将一个字符串缓冲区转换为一个输入流。接收一个String对象作为流的源。(帮助文档上说明:已过时。此类未能正确地将字符转换为字节。从1.1开始,从字符串创建流的首选方法是通过StringReader类进行创建。只有字符串中每个字符的低八位可以由此类使用。)链接流处理器所谓链接流处理器,就是可以接收另一个流对象作为源,并对之进行功能扩展的类。InputStream类型的链接处理器包括以下几种,它们都接收另一个InputStream对象作为流源。()FilterInputStream称为过滤输入流,它将另一个输入流作为流源。这个类的子类包括以下几种:BufferedInputStream:用来从硬盘将数据读入到一个内存缓冲区中,并从缓冲区提供数据。DataInputStream:提供基于多字节的读取方法,可以读取原始类型的数据。LineNumberInputStream:提供带有行计数功能的过滤输入流。PushbackInputStream:提供特殊的功能,可以将已经读取的字节“推回”到输入流中。()ObjectInputStream可以将使用ObjectInputStream串行化的原始数据类型和对象重新并行化。(序列化)()SeqcueneInputStream可以将两个已有的输入流连接起来,形成一个输入流,从而将多个输入流排列构成一个输入流序列。FilterInputStream查看JDK1.4源代码,部分代码如下:Public class FilterInputStream extends InputStream /* * The input stream to be filtered. */ protected InputStream in; protected FilterInputStream(InputStream in) this.in = in; /其它代码FilterInputStream继承了InputStream,也引用了InputStream,而它有四个子类,这就是所谓的Decorator模式上面这个图向我们传达了这个信息:链接流链接流对象接收一个原始流对象或者另外一个链接流对象作为流源;另一方面他们对流源的内部工作方法做了相应的改变,这种改变是装饰模式所要达到的目的。比如:BufferedInputStream“装饰”了InputStream的内部工作方式,使得流的读入操作使用了缓冲机制。在使用了缓冲机制后,不会对每一次的流读入操作都产生一个物理的读盘动作,从而提高了程序的效率,在汲及到物理流的读入时,都应当使用这个装饰流类。LineNumberInputStream和PushbackInputStream也同样“装饰”了InputStream的内部工作方式,前者使得程序能够按照行号读入数据;后者能够使程序读入的过程中,退后一个字符。DataInputStream子类读入各种不同的原始数据类型以及String类型的数据,这一点可以从它提供的各种read方法看出来,如:readByte(),readInt(),readFloat()等。Java语言的I/O库提供了四大等级结构:InputStream,OutputStream,Reader,Writer四个系列的类。InputStream和OutputStream处理8位字节流数据, Reader和Writer处理16位的字符流数据。InputStream和Reader处理输入, OutputStream和Writer处理输出,所以OutputStream,Reader,Writer这三类的装饰模式跟前面详细介绍的InputStream装饰模式大同小异,大家可以看书中其它部分对这三类的详细描述或者从网上也能找到有关资料。使用装饰模式主要有以下的优点:装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错。使用装饰模式主要有以下的缺点:由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行。但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。装饰者模式的应用场景:1、想透明并且动态地给对象增加新的职责的时候。2、给对象增加的职责,在未来存在增加或减少可能。3、用继承扩展功能不太现实的情况下,应该考虑用组合的方式。要点:1,继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。2,在我们的设计中,应该允许行为可以被扩展,而无须修改现在的代码。3,组合和委托可用于在运行动态地加上新的行为。4,除了继承,装饰者模式也可以让我们扩展行为。5,装饰者模式意味着一群装饰者类,这些类用来包装具体组件。6,装饰者类反映出被装饰者的组件

温馨提示

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

评论

0/150

提交评论