装饰设计模式和继承的区别?

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
即具备了缓冲功能,又优化了继承体系。
这种优化方式,很爽。可以解决功能增强问题,并比继承更有灵活性。降低了继承体系的复杂性。

为了方便于以后继续使用该优化方式,就给其起了个名字:装饰设计模式。

要记住,装饰类通常和被装饰类都所属于同一个体系。或者同一个接口。

posted on 2011-06-19 15:51  情定诺坎普  阅读(876)  评论(0编辑  收藏  举报