Java 装饰图案与使用超级

Java 装饰图案与使用超级,java,decorator,Java,Decorator,我刚刚开始学习decorator模式,我很困惑什么时候可以使用decorator模式,或者为什么它与只调用super不同,而不使用指向super类的指针 “…是一种设计模式,允许静态或动态地将行为添加到单个对象,而不影响同一类中其他对象的行为。” 这不就是子类化吗,还是我遗漏了什么 public class Foo { protected void doSomething() { } } //using decorator pattern public class Bar exte

我刚刚开始学习decorator模式,我很困惑什么时候可以使用decorator模式,或者为什么它与只调用super不同,而不使用指向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
    }
}

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

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


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

直接、简洁、清晰的回答。谢谢