2
鑑於典型的咖啡裝飾器示例(從維基百科複製)。如何處理交互裝飾器
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,怎麼會設計這樣一個裝飾系統?
裝飾模式甚至是最好的方法嗎?
建設者模式似乎很有趣,我會看看它,謝謝! – Woofas
施法不違反利斯科夫換人。這兩個概念基本上是正交的。投射涉及句法替換,而Liskov的原則涉及語義替換。 – jaco0646
@ jaco0646:取決於是否拋出基類不拋出的異常(如'NotSupportedException') – jgauffin