最新范文 方案 计划 总结 报告 体会 事迹 讲话 倡议书 反思 制度 入党

设计模式总结-装饰都模式

日期:2020-09-28  类别:最新范文  编辑:一流范文网  【下载本文Word版

设计模式总结-装饰都模式 本文关键词:模式,装饰,设计

设计模式总结-装饰都模式 本文简介:注:文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。使用非继承方式动态的给一个对像增加功能,这种方式在程序运行阶段才动态为其增加功能,故非常灵活。特点:1.装饰者和被装饰者拥有共同的超类。2.装饰者有

设计模式总结-装饰都模式 本文内容:

注:

文档内容基本上来自于网上,并加上自己的理解而成。有的觉得网友总结得非常好,就完全照搬下来,供学习之用。然而,有的摘抄并没有加上原链接和出处,请谅解。

使用非继承方式动态的给一个对像增加功能,这种方式在程序运行阶段才动态为其增加功能,故非常灵活。

特点:

1.

装饰者和被装饰者拥有共同的超类。

2.

装饰者有一个成员变量,指向被装饰者实例。被装饰者实例以参数形式传入装饰者。

3.

执行时动态决定被装饰对像,比使用继承方式更加灵活。

====================================================================================

要点:

1.

特点和本质:

动态的给一个对像增加功能。

2.

应用场景:

3.

C++/JAVA实现

装饰者模式定义:

动态的给一个对像增加其它职责(Responsibility)。就增加对像功能来说,装饰者比生成子实现类更加灵活。

装饰者模式,也叫包装器(Wrapper)模式。它的主要用途,是在不改变一个类的代码、也不改变它的继承体系的前提下,为这个类增加功能。当你可能想为一个类增加更多功能时,使用装饰者模式意味着你的新版本的代码不必通过继承这个类来重用现有的功能。

在动态的增加功能时,为什么装饰者模式比生成子类更加灵活?

我想这是因为

被装饰者

是在装饰者实例产生的时候动态的以参数的方式传给装饰者的,而继承是在编译阶段就已经确定,而以聚合的方式在运行时动态进行扩展当然也就更加灵活。装饰者提供了比继承更有弹性的替代方案

(配合JAVA

IO

API一起理解)

装饰者模式

分类:

读书笔记之设计模式2012-02-03

18:21

221人阅读

评论(0)

收藏

举报

利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都继承到相同的行为。然而,如果能够利用聚合的做法扩展对象的行为(通过参数的方式把被装饰者传给装饰者),就可以在运行时动态地进行扩展。通过动态地组合对象,可以写新的代码添加新功能,而无须修改现有代码。既然没有改变现有代码,那么引进bug或产生意外副作用的机会将大幅度减少。

设计原则

类应该对扩展开发,对修改关闭。

装饰者模式动态地将责任附加到对象上。若需要扩展功能,装饰者提供了比继承更有弹性的替代方案。

装饰者和被装饰者必须是一样的类型,也就是有共同的超类,这是相当关键的地方。在这里,我们利用继承达到了“类型匹配”,而不是利用继承获得“行为”。当我们将装饰者和组件组合时,就是在加入新的行为(这里虽然没有新的方法,比如星巴克中的cost方法)。所得到的新的行为,并不是继承自超类,而是由组合对象得到的。我个人的理解觉得有点利用超类型同样来递归调用的意思。

比如在上面的图中,ConcreteDecoratorA有一个Component类型的ConcreteComponent实例,这个实例是在ConcreteDecoratorA实例的创建时候以参数传给构造函数的。然后再在ConcreteDecoratorA中增加功能。比如:

DataInputStream(InputStream

in)

Creates

a

DataInputStream

that

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对象作为流的源。(JDK帮助文档上说明:已过时。此类未能正确地将字符转换为字节。从JDK1.1开始,从字符串创建流的首选方法是通过StringReader类进行创建。只有字符串中每个字符的低八位可以由此类使用。)

链接流处理器

所谓链接流处理器,就是可以接收另一个流对象作为源,并对之进行功能扩展的类。InputStream类型的链接处理器包括以下几种,它们都接收另一个InputStream对象作为流源。

(1)FilterInputStream称为过滤输入流,它将另一个输入流作为流源。这个类的子类包括以下几种:

BufferedInputStream:用来从硬盘将数据读入到一个内存缓冲区中,并从缓冲区提供数据。

DataInputStream:提供基于多字节的读取方法,可以读取原始类型的数据。

LineNumberInputStream:提供带有行计数功能的过滤输入流。

PushbackInputStream:提供特殊的功能,可以将已经读取的字节“推回”到输入流中。

(2)ObjectInputStream可以将使用ObjectInputStream串行化的原始数据类型和对象重新并行化。(序列化)

(3)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,装饰者类反映出被装饰者的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)。

7,装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。

8,你可以用无数个张世哲包装一个组件。

9,装饰者一般对组件的客户透明的,除非客户程序依赖于组件的具体类型。

10,装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。

参考:http://aixiangct.blog.163.com/blog/static/91522461201011363751978/

    以上《设计模式总结-装饰都模式》范文由一流范文网精心整理,如果您觉得有用,请收藏及关注我们,或向其它人分享我们。转载请注明出处 »一流范文网»最新范文»设计模式总结-装饰都模式
‖大家正在看...
设为首页 - 加入收藏 - 关于范文吧 - 返回顶部 - 手机版
Copyright © 一流范文网 如对《设计模式总结-装饰都模式》有疑问请及时反馈。All Rights Reserved