黑马程序员技术交流社区

标题: 装饰和继承的区别是什么? [打印本页]

作者: 坚强    时间: 2011-11-20 16:49
标题: 装饰和继承的区别是什么?
  是不是继续有局限性,装饰没有?
作者: 赵磊5    时间: 2011-11-20 17:21
装饰是构造函数参数传递进行增强
如果为了某个功能而产生子类(继承)那么那个体系是非常臃肿的

例如:你有个对象有个功能 是在N年前建立的,如今你觉得功能不够用了 写个类把对象传进来就可以解决问题了 如果这个功能写错了 我就把自己写的功能去掉又不影响以前的功能灵活性相当强的。

装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
作者: 後天__牛永志    时间: 2011-11-20 17:26
装饰模式比继承模式更灵活,避免了继承体系的臃肿,降低了类与类之间的关系。
装饰类因为是增强已有对象,具备的功能和已有的是相同的。只不过是提过了更强的功能,所以装饰类和被装饰类都属于一个共同的体系。
BufferedReader 就是一个装饰类,提过了更高效的功能,但,他还是属于Reader的子类。
作者: 王丰盛568    时间: 2011-11-22 13:31
在程序中,可以使用extends关键字让一个类继承另外一个类。
继承的类为子类(派生类),被继承的类为父类(超类, 基类)。
子类会自动继承父类所有的方法和属性。
Java只支持单继承,不支持多继承,但是可以多重继承
因为如果一个类继承多个类,多个类中有相同的方法,子类调用该方法时就不知道该调用哪一个类中的方法了

作者: 任俊杰    时间: 2011-11-22 14:55
本帖最后由 任俊杰 于 2011-11-22 14:56 编辑

正好看了毕老师的视频总结了一下,你看看我发出的博客:http://blog.sina.com.cn/s/blog_7f71be7b0100xbjx.html
作者: 程立彬    时间: 2011-11-22 22:55
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
作者: moonlight    时间: 2011-11-23 08:25
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
即具备了缓冲功能,又优化了继承体系。
这种优化方式,很爽。可以解决功能增强问题,并比继承更有灵活性。降低了继承体系的复杂性。
为了方便于以后继续使用该优化方式,就给其起了个名字:装饰设计模式。
要记住,装饰类通常和被装饰类都所属于同一个体系。或者同一个接口。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2