查看维基百科(pattern)上的装饰模式页面,布局如下所示:
装饰器可以直接实现组件接口(并跳过装饰器接口)吗?
发布于 2015-01-02 18:47:49
使用Decorator模式的主要好处是,对于客户端代码来说,它是透明的。他们不需要了解装饰师,他们可以把它当作基本接口的一个简单的、古老的具体实现:
ThingDoer thingDoer = new ThingDoerDecorator(new AwesomeThingDoer());
ThingDoer otherThingDoer = new AwesomeThingDoer();
thingDoer.doThing();
otherThingDoer.doThing();,这是可能的,因为装饰器实现了与它正在装饰的东西相同的接口。,如果它不实现这个接口,那么您就失去了这个模式的大部分功能。
但是,有时有一个基装饰器实现是有意义的。
abstract class BaseThingDoerDecorator implements ThingDoer {
private ThingDoer thingDoer;
protected BaseDecorator(ThingDoer thingDoer) {
this.thingDoer = thingDoer;
}
@Override
public void doThing() {
thingDoer.doThing();
}
}现在,做这样的事情变得实际起来:
ThingDoer thingDoer = new BaseThingDoerDecorator(new AwesomeThingDoer()) {
@Override
public void doThing() {
System.out.println("This is an anonymous decorator");
super.doThing();
}
};或者,您希望您的所有装饰人员都不受基组件中的异常的影响:
abstract class BaseThingDoerDecorator implements ThingDoer {
// Same as above...
// ...
@Override
public void doThing() {
try {
thingDoer.doThing();
} catch (Exception e) {
log(e);
}
}
}发布于 2015-01-02 18:39:53
下面是您引用的维基百科页面中的UML图表:
在这个图表中,Decorator不是一个接口,而是一个抽象类。组件也不是此图中的接口(因为从它继承的ConcreteComponent和Decorator类没有从图中箭头中的虚线)。我知道这是一个细节,但是UML是有原因的。
也就是说,任何ConcreteDecorator都可以直接从组件继承(或者在您的设计使用接口的情况下实现它的接口),而无需使用Decorator抽象类。但是,所有ConcreteDecorators都需要聚合一个组件,所以如果有多个ConcreteDecorator,抽象类可能对避免重复代码很有用。
https://stackoverflow.com/questions/27735410
复制相似问题