首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >装饰师可以是组件的直接子类吗?

装饰师可以是组件的直接子类吗?
EN

Stack Overflow用户
提问于 2015-01-01 22:48:33
回答 2查看 93关注 0票数 1

查看维基百科(pattern)上的装饰模式页面,布局如下所示:

  • 组件接口
  • 组件实现
  • 实现组件接口的装饰器接口。
  • 实现装饰器接口的装饰器。

装饰器可以直接实现组件接口(并跳过装饰器接口)吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-02 18:47:49

使用Decorator模式的主要好处是,对于客户端代码来说,它是透明的。他们不需要了解装饰师,他们可以把它当作基本接口的一个简单的、古老的具体实现:

代码语言:javascript
运行
复制
ThingDoer thingDoer = new ThingDoerDecorator(new AwesomeThingDoer());
ThingDoer otherThingDoer = new AwesomeThingDoer();

thingDoer.doThing();
otherThingDoer.doThing();

,这是可能的,因为装饰器实现了与它正在装饰的东西相同的接口。,如果它不实现这个接口,那么您就失去了这个模式的大部分功能。

但是,有时有一个基装饰器实现是有意义的。

代码语言:javascript
运行
复制
abstract class BaseThingDoerDecorator implements ThingDoer {
    private ThingDoer thingDoer;

    protected BaseDecorator(ThingDoer thingDoer) {
        this.thingDoer = thingDoer;
    }

    @Override
    public void doThing() {
        thingDoer.doThing();
    }
}

现在,做这样的事情变得实际起来:

代码语言:javascript
运行
复制
ThingDoer thingDoer = new BaseThingDoerDecorator(new AwesomeThingDoer()) {
    @Override
    public void doThing() {
        System.out.println("This is an anonymous decorator");
        super.doThing();
    }
};

或者,您希望您的所有装饰人员都不受基组件中的异常的影响:

代码语言:javascript
运行
复制
abstract class BaseThingDoerDecorator implements ThingDoer {
    // Same as above...
    // ...
    @Override
    public void doThing() {
        try {
            thingDoer.doThing();
        } catch (Exception e) {
            log(e);
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-01-02 18:39:53

下面是您引用的维基百科页面中的UML图表:

在这个图表中,Decorator不是一个接口,而是一个抽象类。组件也不是此图中的接口(因为从它继承的ConcreteComponent和Decorator类没有从图中箭头中的虚线)。我知道这是一个细节,但是UML是有原因的。

也就是说,任何ConcreteDecorator都可以直接从组件继承(或者在您的设计使用接口的情况下实现它的接口),而无需使用Decorator抽象类。但是,所有ConcreteDecorators都需要聚合一个组件,所以如果有多个ConcreteDecorator,抽象类可能对避免重复代码很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27735410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档