装饰者设计模式

定义:动态将扩展功能附加到对象上,替代继承的另一种选择。类图如下:

(图片引自http://www.cnblogs.com/NeeoMeng/articles/1127974.html装饰者模式类图

 

 定义看起来不是很好理解,其实只要用过Java IO,我们已经在用装饰者这种设计模式了 -, -

 先看看java io package里对于有关InputStream类的分布情况

 

 

上图中,FilterInputStream即可被看作Decorator Class。

照猫画虎,我们也可以编写自己的Java I/O装饰着对象了。

如实现将输入流内所有字符变为大写或者小写。我们需要做的仅仅是继承FilterInput类,覆写两个方法即可。

 

问题来了,为什么不直接同StreamBufferInputStream类一样继承InputStream实现转换大小写的功能呢?

其实,如果只是单纯的继承关系,那么我们想实现既用Buffer,又要让它大小写转换将怎么办呢~建个UpperCaseStringBufferInputStream同样继承InputStream? 此方法肯定不是王道,逐渐的,类会多的让人想死,Java的设计者自然也想到了这样的问题。

用装饰者模式可以轻松解决爆炸式类继承的问题,如果还有点晕,看了下面代码估计就懂了。

 

UpperCaseInputStream类,继承FilterInputStream

覆写InputStream里的两个主要read()方法

 

 

 同理,Java I/O中的Reader类也是采用了装饰者的设计模式

 Reader比InputStream相对复杂点,如果某些方法或者构造函数不知如何覆写,可参照JDK源码中同样继承Reader的相关类,如BufferedReader.

 两个重要的方法,依旧是read()

 

 LowerCaseReader类继承自FilterReader

 

 

 

编写个简单的测试类:

ReaderTest

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值