您的位置:首页 > 编程语言 > Java开发

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

2011-06-29 15:27 309 查看
 

一、装饰(Decorator)模式的结构
装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
装饰模式有透明和半透明的两种,这两种的区别就在于装饰角色的接口与抽象构件角色的接口是完全一致。半透明情况下装饰角色的接口比抽象构件角色的接口宽。
所下图所示:



如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类。
二、装饰模式适用的场景
1、需要扩展一个类的功能,或给一个类增加附加责任。
2、需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
3、需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实。
装饰模式的优点:
1、装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
2、通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
三、工厂方法与其他模式的关系
适配器模式
装饰模式和适配模式都是包装(Wrapper)模式。适配器模式的用意是要改变所考虑的对象的接口而不一定改变对象的性能,而装饰模式的用意是要保持接口,从而增加所考虑对象的性能。
策略模式
装饰模式将一个东西的表皮换掉,而保持它的内心。策略模式恰好相反,它在保持接口不变的情况下,使具体算法可以互换。
装饰模式的实现要求Component类尽量地“轻”,而策略模式要求抽象策略类尽量的“重”。
合成模式
装饰模式常常用在合成模式的行为扩展上。使用继承关系扩展合成模式的行为很困难。装饰模式是继承关系的替代方案,装饰模式可以动态地为合成模式添加新的行为。
四、装饰模式在java中的应用
         java
I/O

java I/O库的两个对称性和两个设计模式
两个对称性
1、输出—输入对称:比如InputStream和OutputStream各自占据Byte流的输入与输出的两个平行结构的根部:而Reader和Writer各自占据Char流的输入与输出的两个平行的等级结构的根部。
2、byte—char对称:InputStream与Reader的子类分别负责Byte和Char流的输入;OutputStream与Writer的子类分别负责Byte和Char流的输出,它们分别形成平行的等级结构。
两个设计模式
1、装饰模式:在由InputStream、OutputStream、Reader和Writer代表的等级结构内部,有一些流处理器可以对另一流处理器起到装饰作用,形成新的、具有改善了的功能的流处理器。
2、在由InputStream、OutputStream、Reader、Writer代表的等级结构内部,有一些流处理器是对其他类型的流源的适配。这就是适配器模式的应用。
 
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输出流的一个适配器。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息