《java与模式》学习系列——装饰模式

 

一、 装饰(Decorator)模式的结构

装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。

装饰模式有透明和半透明的两种,这两种的区别就在于装饰角色的接口与抽象构件角色的接口是完全一致。半透明情况下装饰角色的接口比抽象构件角色的接口宽。

所下图所示:

如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把DecoratorConcreteDecorator的责任合并成一个类。

二、 装饰模式适用的场景

1、需要扩展一个类的功能,或给一个类增加附加责任。

2、需要动态地给一个对象增加功能,这些功能可以再动态地撤销。

3、需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。

装饰模式的优点:

1、装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。

2、通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

三、 工厂方法与其他模式的关系

适配器模式

装饰模式和适配模式都是包装(Wrapper)模式。适配器模式的用意是要改变所考虑的对象的接口而不一定改变对象的性能,而装饰模式的用意是要保持接口,从而增加所考虑对象的性能。

策略模式

装饰模式将一个东西的表皮换掉,而保持它的内心。策略模式恰好相反,它在保持接口不变的情况下,使具体算法可以互换。

装饰模式的实现要求Component类尽量地“轻”,而策略模式要求抽象策略类尽量的“重”。

合成模式

装饰模式常常用在合成模式的行为扩展上。使用继承关系扩展合成模式的行为很困难。装饰模式是继承关系的替代方案,装饰模式可以动态地为合成模式添加新的行为。

四、装饰模式在java中的应用

         java I/O

java I/O库的两个对称性和两个设计模式

两个对称性

1、输出—输入对称:比如InputStreamOutputStream各自占据Byte流的输入与输出的两个平行结构的根部:而ReaderWriter各自占据Char流的输入与输出的两个平行的等级结构的根部。

2bytechar对称:InputStreamReader的子类分别负责ByteChar流的输入;OutputStreamWriter的子类分别负责ByteChar流的输出,它们分别形成平行的等级结构。

两个设计模式

1、装饰模式:在由InputStreamOutputStreamReaderWriter代表的等级结构内部,有一些流处理器可以对另一流处理器起到装饰作用,形成新的、具有改善了的功能的流处理器。

2、在由InputStreamOutputStreamReaderWriter代表的等级结构内部,有一些流处理器是对其他类型的流源的适配。这就是适配器模式的应用。

 

InputStream中的装饰模式:

InputStream类型中的装饰模式是半透明的,换言之,链接流处理器在对源流处理器进行功能增强的同时,改变了源流处理器的接口。例如:BufferedInputStream是一个半透明的装饰类,因为他提供了额外的方法ensureOpen()fill(),如果客户端持有一个类型为InputStream的对象引用in的话,那么如果用BufferedInputStream装饰后,只要客户端不需要使用像ensureOpen以及fill方法,客户端就没有问题。但是如果客户端必须使用这两个方法,那必须进行向下类型转换,那么这个类型转换意味着客户端必须知道它拿到的引用是指向一个类型为BufferedInputStream的对象的,这就破坏了使用装饰的原始用意:不让客户端察觉它使用的仅是一个装饰,而不是原始流角色。

Reader类型的装饰模式:

 

InputStream中的适配器模式:

ByteArrayInputStream继承了InputStream的接口,而封装了一个byte数组。换言之,它将一个byte数组的接口适配成InputStream流处理器的接口。

StringBufferInputStream继承了InputStream类型,同时持有一个对String对象的引用。这是一个将String对象适配成InputStream类型的对象形式的适配器模式

byte流到char流的适配:

InputStreamReader是从byte输入流到chr输入流的一个适配器

OutputStreamWriter是从byte输出流到char输出流的一个适配器。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值