装饰模式与使用超级

时间:2013-11-21 22:35:56

标签: java decorator

我刚刚开始学习装饰模式,我很困惑何时可以使用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
    }
}

1 个答案:

答案 0 :(得分:2)

你缺少的是你可以创建多个装饰器并任意组合它们。

例如,如果您有一个表示GUI窗口的类Window并希望能够添加水平和/或垂直滚动​​条,则通过子类化可能最终会生成子类 VerticalScrollingWindowHorizontalScrollingWindowBidirectionalScrollingWindow,如果您还想添加其他功能,则必须将每个功能组合为所有这些功能的另一个子类以及原始{{1} }。

但是对于装饰者,你可以避免这种组合爆炸。您需要WindowVerticalScrollDecorator并且要获得垂直和水平,您只需要装饰两次。如果你有其他功能,每个功能需要另外一个装饰器。