A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

゛﹏_小三No°

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© ゛﹏_小三No° 初级黑马   /  2012-8-10 15:24  /  1419 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在IO流学习中,看到了装饰设计和继承,想同学帮我解释下他们的区别

3 个回复

倒序浏览
本帖最后由 张雪磊 于 2012-8-10 15:37 编辑

以前是通过继承将每一个子类都具备特定功能。
那么继承体系会复杂,并不利于扩展。

现在优化思想。单独描述一下缓冲内容。
将需要被装饰的对象。传递进来。也就是,谁需要被装饰,谁就作为参数传递给装饰类。
这样继承体系就变得很简单。优化了体系结构。





装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个问题好像问的也不少,我直接把回答拷贝过来了。
装饰和继承。
装饰设计模式是一种解决某一类问题的思想。该类问题的有效解决方案。
解决给类提供增强型功能的问题。
继承:是面向对象的特征之一。





Writer
|--TextWriter
|--MediaWirter

该体系的出现已经可以完成对文本数据和媒体数据的写操作。
但是发现。效率较低。为了提高效率,就加入了缓冲技术。
文本写入需要缓冲
媒体写入需要缓冲

按照面向对象的思想,为了提高扩展,
通过继承的方式完成。
Writer
|--TextWriter
  |--BufferedTextWriter  
|--MediaWirter
  |--BufferedMedieWriter

这就完成了文本和媒体数据写操作效率提高。

当如果该体系加入一个子类 BaseWriter,而且该子类也许要效率提高。
Writer
|--TextWriter
  |--BufferedTextWriter  
|--MediaWirter
  |--BufferedMedieWriter
|--BaseWriter
  |--BufferedBaseWriter
如果体系扩展,都需要定义一个该子类具备高效缓冲功能的子类。
这样体系扩展很麻烦。

如何把这个体系出现问题解决一下,并优化一下呢?

我们发现,这些子类使用的缓冲技术都是一样的。
缓冲区其实就是定义了临时存储容器将数据进行临时缓冲,
至于具体的写操作,还是Writer的子类对象完成的,比如 TextWriter. MediaWriter等。

既然这样,可以将缓冲技术单独封装成一个对象,
要对哪个具体对象进行缓冲技术的使用,只要将该对象传递给缓冲区对象即可。


//对缓冲区对象进行单独描述。
class BufferedWriter extends Writer
{

BufferedWriter(Writer w)
{

}

// BufferedWriter(TextWriter tw)
// {}

// BufferedWriter(MediaWriter dw)
// {}
}



当缓冲技术单独封装成了对象后,它具备的还是写功能,只不过可以其他对象的写功能进行高效。
所以它还是Writer类中的一员。

所以这时体系变成了
Writer
|--TextWriter
|--MediaWirter
|--BufferedWriter:这是一个提供增强功能的类。就把这种优化方式,定义成一种最终的解决该问题的解决方案
     并起个名字:装饰设计模式。

和原来的体系,变的很清爽。
Writer
|--TextWriter
  |--BufferedTextWriter  
|--MediaWirter
  |--BufferedMedieWriter


装饰设计模式的出现可以对一组类进行功能的增强。
而且装饰类本事也是该体系中的一个子类。

代码体现:
通常情况下,
装饰类一般不单独存在。
都是通过构造函数接收被装饰的对象。
基于被装饰的对象的功能,并对外提供增强行的功能。


和继承的区别:
继承会让体系变得臃肿,
装饰更为灵活。



在IO中装饰设计模式用的很多。
比如
BufferedWriter
BufferedReader

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
同学,不改名是不能给分的!以下是改名通道!http://bbs.itheima.com/thread-19719-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马