【问题标题】:Decorator Pattern vs Using super [duplicate]装饰器模式与使用超级 [重复]
【发布时间】:2013-12-06 15:43:40
【问题描述】:

我刚开始学习装饰器模式,我很困惑什么时候可以使用装饰器模式,或者为什么它与不使用指向超类的指针调用 super 不同。

"...是一种设计模式,允许将行为添加到单个对象,无论是静态的还是动态的,而不影响同一类中其他对象的行为。"

这和只是子类化不一样还是我错过了什么?

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
    }
}

【问题讨论】:

    标签: java decorator


    【解决方案1】:

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

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

    但是使用装饰器,您可以避免这种组合爆炸。你需要一个VerticalScrollDecorator,一个HorizontalScrollDecorator,要同时获得垂直和水平,你只需要装饰两次。如果您有其他功能,则每个功能都需要另一个装饰器。

    【讨论】:

    • 直接、简洁、清晰的回答。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-09-25
    • 2013-05-07
    • 2011-10-04
    • 2017-08-01
    • 1970-01-01
    • 2011-01-16
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多