在java流中用到的Decorator模式

从new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的?晚上睡在床上,这一小段代码在我的脑海里不断浮现,因为它看上去有些相似(在设计模式中的看到过类似),但是实在想不起与那个模式相似了?

翻开设计模式书,已经好久没有看到过本书了,说实话对这本书中的大多数还不是很了解,但是此刻看到能让我想到了,说明这个模式给我留下了深刻的影响。翻开书找了半天,我一直以为是Strategy,后来看了下不是的,从头看到尾,终于找到了Decorator(装饰)。把这个设计模式又仔细读了一遍,在这里与大家分享。

设计意图

动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比较生产子类更为灵活。

设计动机

有时候我们希望给某个对象增加而不是整个类增加一些功能,例如,给一个图像界面工具箱允许你对人员一个用户界面的组件添加一些特性,比如说边框,或者窗口滚动。

使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所实现。但是这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。

一种较为灵活的方式是将组件嵌入另外一个对象中,由这个对象添加边框,我们称这个嵌入的对象为装饰。

结构

代码部分我们就不详细说明,如下图所示:

这张图当时好象是我学习设计模式中,看的最清楚的一张(难得啊,设计模式中的那么多图,很多当时看的时候都不是很明白),当然这张图不是我最在意的。

Decorator 模式的经典使用

Streams是大多数I/O设备的基础抽象对象,它提供了将对象转换为字符或字符流的操作接口,使得我们可以将一个对象转换成另外一个文件或者内存中的字符串,可以在以后恢复中使用。说了这么多,估计大家也不是很明白,看了下面这张图估计你就明白了:

Stream-UML

看了上面这张图,我记得当时顿时对C++中的那么多XXXInputStream,XXXXOutputStream明白了很多。对上面这很张图稍微解释:Stream抽象类位置一个内部缓冲区并提供一些操作(PutInt(),PutString())用于将数据存入流中,一段这个缓冲区满了,Stream就会调用抽象操作HandleBufferFull()进行实际数据传递,在FileStream中重定义这个操作,将缓冲区的数据传递到文件中去。

这里的关键类是StreamDecorator,它维持了一个指向组件流的指针并将请求转发给它,StreamDecorator子类重定义HandleBufferFull()操作并且在调用StreamDecorator的HandleBufferFull()操作之前执行一些额外的动作。

例如:CompressingStream子类用于压缩数据,而ASCII7Stream将数据转换成7位ASICC码,现在我们创建FileStream类,它首先将数据压缩,然后将压缩了的二进制数据转换为7位ASICC码,我们用CompressingStream和ASCII7Stream装饰FileStream:

Sream *aStream = new CompressingStream(
new ASCII7Stream(
new FileStream(“aFileName”)
)
);
aStream->PutInt(12);
aStream->PutString(“moandroid”);

记得当时给我印象最深的就是在这个地方,突然间让我明白了很多。

总结说明

很早以前看到这个地方,感受颇深,今天再次看到这个地方,一方面时间已经过去了很多,另外一方面对问题的理解也比较深入了。从new BufferedReader(new InputStreamReader(conn.getInputStream()))想到的,也许不是这段代码,而是当时那种学习的心境,硬着头皮看(尽管当时很多看不懂),而现在已经很久没有那种心境了,这次写下这篇博客留恋。

转载自:http://www.moandroid.com/?p=1419


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值