jameszhang
CJSDN高级会员
发贴: 1594
积分: 111
|
于 2004-05-10 11:08
下面是在一篇译文中截取的: --------------------------------------------------------
对于开发人员而言,最直观的Decorator实现就是:写一个派生类,它继承自被装饰类,并 赋于新的职责。新的职责可以是通过增加方法或是修改已有方法来实现。
public class DebugButton extends JButton { public DebugButton() { addActionListener(new ActionListener() { System.out.println("debug message"); }); }}
此外,我们也可以用相同的方式来实现ScrollOverButton:不是增加ActionListener,而是 增加MouseListener。在MouseListener回调方法中改变JButton的边框,当mouseEntered() 被调用时,将边框从EmpetyBorder变为RaisedBevelBorder。而当mouseExited()方法被调用 时,再将边框从RaisedBevelBorder恢复成EmpetyBorder。
对于BufferedInputStream,同样实现也是非常简单的。修改每个读数据的方法,让它从内 存缓冲区来读取数据。如果缓冲区是空的,它可以通过super.read()方法来获取数据并填充 缓冲区。JScrollPane,要实现起来就有点复杂,下面我将讨论为什么它会比较难以用继承的方式来实现。
讨论一下继承方式实现Decorator模式的优点与缺点:
优点 1 我们几乎可以用这个方式实现所有的Decorator。 2 使用继承方式实现Decorator模式,可以保留被装饰类的原始类型,这一点是非常重要 的。用继承方式,我们仍可以使用被装饰类的在被装饰之前的类型,例如,我们可以在我们 的应用程序中使用ScrollOverButton代替JButton,但是JScrollPane就不能代替包含在它内 部的对象。
缺点 1 用继承的方式仍不够直接。设想一下我们实现了ScrollOverButton和DebugButton,但是 我们又需要实现一个既有ScrollOverButton特点又有DebugButton行为的按钮。怎么办?用 继承方式我们唯一的选择就是再派生出一个ScrollOverDebugButton类。如果我们有了 ScrollOverDebugButton的实现,那么是否还需要继续保留ScrollOverButton或DebugButton 实现?因为我们可以为ScrollOverDebugButton增加两对方法来打开或关闭debug或scroll- over的行为:
总结
我看不出在任何场合使用继承来实现装饰器是明智的。它看上去很简单,但是在扩展性方面存在困难,并且违背了面向对象思想。建议不要使用这种方式来实现装饰器。
jameszhang edited on 2004-05-10 11:10
"First they ignore u, then they laugh at u, then they fight u, then u will win
Mahatma Gandhi"
|