鉴于经典的咖啡装饰示例(从维基百科复制而来)。
public interface Coffee {
public double getCost();
}
public class SimpleCoffee implements Coffee {
public double getCost() {
return 1;
}
}
public abstract class CoffeeDecorator implements Coffee {
protected final Coffee decoratedCoffee;
public CoffeeDecorator(Coffee c) {
this.decoratedCoffee = c;
}
public double getCost() {
return decoratedCoffee.getCost();
}
}
class WithMilk extends CoffeeDecorator {
public WithMilk(Coffee c) {
super(c);
}
public double getCost() {
return super.getCost() + MILKCOST;
}
public int someAttribute;
}
class WithMocha extends CoffeeDecorator {
public WithMocha(Coffee c) {
super(c);
}
public double getCost() {
return super.getCost() + MOCHACOST;
}
}
如果WithMilk装饰器存在,假设我希望我的WithMocha成本使用someAttribute,那么如何设计这样的装饰系统呢?
装饰者模式甚至是最好的方法吗?
答案 0 :(得分:2)
不,它不是,因为将咖啡实例投射到装饰器会违反Liskovs substution principle。
由于您的问题没有详细说明您想要解决的真正问题,因此很难给出正确答案。
如果你想构建不同部分可以互动的对象,Builder pattern是一个更好的选择。