【发布时间】:2018-07-30 13:58:29
【问题描述】:
对于这种模式的使用是否有任何硬性规定,或者它只是为了在不使用继承的情况下在方法调用中实现附加功能的一种方式?
我已经修改了以下示例,该示例取自 SO 帖子,以展示我正在考虑的内容。
public interface Coffee {
public double getCost();
public String getIngredients();
}
public class SimpleCoffee implements Coffee {
@Override
public double getCost() {
return 1;
}
@Override
public String getIngredients() {
return "Coffee";
}
}
public class CoffeeDecorator implements Coffee {
protected final Coffee decoratedCoffee;
public CoffeeDecorator(Coffee c) {
this.decoratedCoffee = c;
}
@Override
public double getCost() {
//you can add extra functionality here.
return decoratedCoffee.getCost();
}
@Override
public String getIngredients() {
//you can add extra functionality here.
return decoratedCoffee.getIngredients();
}
public boolean methodNotDefinedInInterface() {
//do something else
return true;
}
}
那么考虑到上面的例子,是否可行:
a) 只要你觉得合适就使用简单的咖啡,不要装饰它
b) 将 Coffee 接口中未定义的附加功能添加到装饰器对象,例如 methodNotDefinedInInterface()
有人也可以解释一下组合在哪里进入这种模式,因为SimpleCoffee 是可以独立存在的东西,但它似乎是实际“拥有”任何对象的装饰器。
尽管没有SimpleCoffee 类(或Coffee 的一些具体实现),装饰器没有任何用途,所以聚合似乎不是这里发生的事情。
【问题讨论】:
-
这不是直接回答你的问题,而是密切相关stackoverflow.com/questions/18618779/…