java程序员从笨鸟到菜鸟之(三十八)IO流之装饰器模式初探

来源:互联网 发布:网络直播社会现象 编辑:程序博客网 时间:2024/06/05 18:13

装饰器设计模式

1 装饰器模式引出

通常为了扩展一个类(扩展方法),有两种方式

方式1:要么直接修改类添加相应的功能,要么使用继承方式派生对应的子类来扩展

特点:采用适配器的模式,通过继承派生对应的子类来扩展功能

缺点:由于继承为类引入静态特征,并且随着扩展功能的增多,会导致子类数目的急剧增多,子类会很膨胀。

显然方式1并不可取,引出了第二种模式

方式2:使用对象组合的方式(关联),也就是今天我们要讲的装饰器模式

装饰模式设计目的:实现动态的为对象添加功能,即从一个对象外部来给对象添加功能。

装饰器模式特点:就是基于对象组合的方式,也即动态组合的方式,可以很灵活的给对象添加所需要的功能;动态是手段,组合才是目的

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

总之,装饰模式是通过把复杂的功能简单化,分散化,然后再运行期间,根据需要来动态组合的这样一个模式。

所以在面向对象的设计中,而我们也应该尽量使用对象组合,而不是对象继承来扩展和复用功能。

装饰器模式实例说明: 

1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 

2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里,这时画、玻璃和画框形成了一个物体。

1.2.模式结构和说明

  装饰模式的结构图



由于是针对I/O流的,所以以I/O流为例,回头再补充

Component:---InputStream

说明:组件对象的接口(或抽象类),可以给这些对象动态的添加职责;

ConcreteComponent:---FileInputStream、DataInputStream等

说明:具体的组件对象实现了组件接口,该对象通常就是被装饰器装饰原始对象,称为待包装对象被装饰者,被装饰者初始状态可以设置为自己的装饰,可以给这个对象添加职责;

Decorator:---FilterInputStream

说明:所有装饰器的基类(父类)—抽象类,需要定义一个与组件接口一致的接口

补充:装饰器的基类为什么要(继承)实现一个与组件接口一致的接口(抽象类)?

(主要是为了实现装饰器功能的复用,即具体的装饰器A可以装饰另外一个具体的装饰器B,因为装饰器类也是一个Component),持有一个Component对象,该对象其实就是被装饰的对象(接口多态的形式)。如果不继承组件接口类,则只能为某个组件添加单一的功能,即装饰器对象不能再装饰其它的装饰器对象。通过FilterInputStream源码来看,有一个成员变量InputStream的对象,继承了组件接口(抽象类)InputStream的方法,其实还是抽象方法。

ConcreteDecorator:----DataInputStream、BufferedInputStream等

说明:具体的装饰器类,实现具体要向被装饰对象添加的功能;用来装饰具体的组件对象或者另外一个具体的装饰器对象。

分析:具体的装饰器类的每一个构造方法的形式参数都有InputStream接口(抽象类),表明只要是该InputStream的实现类的对象都可以传递进去;且构造方法中均都有一个super(InputStream in)---指向了装饰器基类的构造方法,上面我们提到过此装饰器基类有一个成员变量:InputStream的对象。

举例j说明:参考依据---底层源码,噶没兴趣的话可以自己分析下

过程:在创建具体装饰器对象(BufferedInputStream)中把待包装--待装饰对象(FileInputStream)作为构造方法的实参传入,由于(具体装饰器---装饰器基类的子实现类)BufferedInputStream继承了装饰器基类(FilterInputStream),首先通过super()会调用装饰器基类FilterInputStream的构造方法,而此装饰器基类有一个成员变量(组件的接口对象---InputStream),通过装饰器基类的构造方法对其成员变量初始化;在具体装饰器类方法中可以调用被装饰对象方法的方式:通过super.方法名(参数)的方式,在具体装饰器类方法中可以调用被装饰对象方法的原因抽象装饰基类实现了接口,并且有一个成员变量为此接口的对象,super已经由构造传递并指向了具体的某一个被装饰者类,那么调用的即为被装饰类的方法,实际上这里全是重写了被装饰对象的方法(原因:可能原来的方法不是所需)

感悟:不要被表面所迷惑,背后的力量很强大,也很复杂,共同支撑和维护着

装饰作用:通过装饰者的多层装饰,把细节变得丰富,在调用前后可以实现自己的输出,这就是装饰器所扩展的功能。

由此引出装饰器模式的特点:----判断一种模式是不是装饰器模式

百度百科中的定义:装饰模式指的是在不必改变原类文件使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

说明:原类---被装饰的类;使用继承--被装饰类的子类继承被装饰的类

特征

(1) 装饰对象和真实对象(被装饰对象)有相同的接口,这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象(被装饰对象)的引用。
(3) 装饰对象接受所有来自客户端的请求,它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

百度百科链接:点击打开链接

要点、适用性、优点、缺点:点击打开链接

装饰器和适配器模式对比:点击打开链接

最初看的:点击打开链接

大神:点击打开链接

集合框架的装饰器模式:点击打开链接



阅读全文
0 0
原创粉丝点击