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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 花开~的季节 黑马帝   /  2012-2-28 09:30  /  1644 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

装饰模式和继承到底有什么区别呢

评分

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

查看全部评分

2 个回复

倒序浏览
装饰模式比继承要灵活。避免了继承体系臃肿。而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
回复 使用道具 举报
装饰设计模式和继承的区别,让我们一起来分析下。
Writer
|--TextWriter.
|--MediaWriter
发现可以形成体系,就是无论操作什么数据,但都是操作数据,可以抽取。

操作数据的效率有些低,为了提高这个操作效率,
使用缓冲技术。通过面向对象三个特点中的继承,发现可以继承完成功能的增强。
那么对具体的功能对象进行子类的扩展。
形成了一下的体系。

Writer
|--TextWriter.
   |--BufferedTextWriter
|--MediaWriter
   |--BufferedMediaWriter
该体系是完全可以应用的。
但是一点不太爽,当该操作数据的体系中如果出现了新的功能对象。
Writer
|--TextWriter.
   |--BufferedTextWriter
|--MediaWriter
   |--BufferedMediaWriter
|--DataWriter---新的功能对象。
   |--BufferedDataWriter
如果后期出现了象DataWriter这样新的功能对象时,为了提高该对象的操作效率,
该对象也需要有一个子类带有缓冲技术。
导致每出现一个新功能子类,该子类都要有一个带缓冲技术的子类。
对于扩展较为麻烦。而且让这个继承体系因为不断扩展而变得非常臃肿。

需要对该体系进行优化。
以前是让每一个功能对象都具备缓冲技术。
现在可不可以单独定义一个缓冲技术对象,要缓冲谁,就把谁传进来即可。
class BufferWriter
{
BufferWriter(Writer w)
{
}
/*
BufferWriter(TextWriter tw)
{
}
BufferWriter(MediaWriter mw)
{
}
*/
}
将缓冲技术封装成对象后,那么每一个功能对象就没有必要在定义带有缓冲技术的子类对象了。
体系就变成了
Writer
|--TextWriter.
|--MediaWriter
|--DataWriter
|--BufferWriter
即具备了缓冲功能,又优化了继承体系。
这种优化方式,很爽。可以解决功能增强问题,并比继承更有灵活性。降低了继承体系的复杂性。
为了方便于以后继续使用该优化方式,就给其起了个名字:装饰设计模式。
要记住,装饰类通常和被装饰类都所属于同一个体系。或者同一个接口。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马