我刚刚开始学习装饰模式,我很困惑何时可以使用Decorator模式,或者为什么它与仅使用指向超类的指针调用super,w / o不同。
“...是一种设计模式,允许将行为静态或动态地添加到单个对象,而不会影响同一类中其他对象的行为。”
是不是只是继承子类或者我错过了什么?
public class Foo {
protected void doSomething() { }
}
//using decorator pattern
public class Bar extends Foo {
private foo;
public Bar(Foo foo) {
this.foo = foo;
}
public void doSomething() {
foo.doSomething();
// extra code
}
}
//using super
public class Bar extends Foo {
@Overide
public void doSomething() {
super.doSomething();
// extra code
}
}
答案 0 :(得分:2)
你缺少的是你可以创建多个装饰器并任意组合它们。
例如,如果您有一个表示GUI窗口的类Window
并希望能够添加水平和/或垂直滚动条,则通过子类化可能最终会生成子类
VerticalScrollingWindow
,HorizontalScrollingWindow
,BidirectionalScrollingWindow
,如果您还想添加其他功能,则必须将每个功能组合为所有这些功能的另一个子类以及原始{{1} }。
但是对于装饰者,你可以避免这种组合爆炸。您需要Window
,VerticalScrollDecorator
并且要获得垂直和水平,您只需要装饰两次。如果你有其他功能,每个功能需要另外一个装饰器。