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;
}
}
方法1は、このようなデコレータシステムを設計だろう、私はWithMilkデコレータが存在する場合は、私のWithMochaコストがsomeAttributeを使用すると仮定しますか?
デコレータパターンは最善のアプローチですか?
ビルダーのパターンは面白そうですが、私はそれを見て、感謝! – Woofas
キャスティングはリスコフの代用に違反しない。 2つの概念はほぼ直交しています。キャストには構文的な置換が含まれ、Liskovの原理には意味的な置換が含まれます。 – jaco0646
@ jaco0646:(NotSupportedExceptionのように)基本クラスがスローしない例外を投げるかどうかによって決まります – jgauffin