私は本 "ヘッドファーストデザインパターン"のデコレータパターンの例で遊んでいます。私はbeverage3
のフィールド記述の値は "ハウスブレンドコーヒー"でなければならないと思ったが、それは "不明な飲み物"である。デコレータパターン:コンクリートコンポーネントのフィールドの値はコンポーネントからのフィールドの値ですが、なぜですか?
誰かがこれを説明できますか?私たちはインタフェースに対してコード化していますが(この例では抽象クラスです)、HouseBlendクラスをインスタンス化しているので、値は "House Blend Coffee"にする必要がありますが、そうではありません。
以下のコードは、この例のすべてのクラスを含んでいません。
public class StarbuzzCoffee {
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()
+ " $" + beverage.cost());
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription()
+ " $" + beverage2.cost());
Beverage beverage3 = new HouseBlend();
System.out.println("(added by me)return value of getDescription() without condiment: " + beverage3.getDescription());
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription()
+ " $" + beverage3.cost());
System.out.println("(added by me)value of field desciption: " + beverage3.description);
}
}
Beverage.java
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost();
}
CondimentDecorator.java
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
HouseBlend.java
public class HouseBlend extends Beverage{
public HouseBlend() {
description = "House Blend Coffee";
}
@Override
public double cost() {
return .89;
}
}
CondimentDecorator.java
public class Mocha extends CondimentDecorator{
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
@Override
public double cost() {
return beverage.cost() + .20;
}
}
私はあなたに役立つ答えを追加しました。あなたはまだ疑問があるならば、ただ聞いてください。私は前にこの問題に噛まれてきた...乾杯! – wleao