在裝飾模式,我很困惑如何使用裝飾方法。我已經瞭解到,裝飾器模式用於將函數添加到基類。但是我只能調用最外層的裝飾器的方法,所以如果在接口中沒有提到,我應該如何使用inner-decorator的方法。我不擅長英語,所以我編寫代碼來演示我的問題。裝修模式與合同
public class OrderSystem {
public static void main(String[] args) {
Pancakes pancakes = new MixedPancakes();
pancakes = new Ham(pancakes);
((Ham) pancakes).hamState(); // call hamState
pancakes = new Egg(pancakes);
((Egg) pancakes).eggState();
// i can't call hamState() there because it not belong to Egg
Pancakes pancakes1 = new Ham(new Egg(new FlourPancakes()));
// similarly, i can't use eggState() there.
System.out.println("訂單:" + pancakes1.getDescription());
System.out.println("價格:" + pancakes1.cost());
}
}
interface Pancakes {
public abstract String getDescription();
public abstract int cost();
}
abstract class Seasoning implements Pancakes {
@Override
public abstract String getDescription();
}
class Ham extends Seasoning {
Pancakes pancakes;
public Ham(Pancakes pancakes) {
this.pancakes = pancakes;
}
@Override
public int cost() {
return pancakes.cost() + 2;
}
@Override
public String getDescription() {
return pancakes.getDescription() + "+火腿";
}
public void hamState() {
System.out.println("火腿切碎");
}
}
class Egg extends Seasoning {
Pancakes pancakes;
public Egg(Pancakes pancakes) {
this.pancakes = pancakes;
}
@Override
public int cost() {
return pancakes.cost() + 1;
}
@Override
public String getDescription() {
return pancakes.getDescription() + "+雞蛋";
}
public void eggState() {
System.out.println("雞蛋打碎");
}
}
class MixedPancakes implements Pancakes {
@Override
public String getDescription() {
return "五穀雜糧煎餅";
}
@Override
public int cost() {
return 6;
}
}
class FlourPancakes implements Pancakes {
@Override
public String getDescription() {
return "白麪煎餅";
}
@Override
public int cost() {
return 5;
}
}
當我問註釋,當裝飾用另一個包裹,只在接口中聲明的方法(如cost()
和getDescription()
)將工作,而另一種方法將不再被調用。我想如果我創造一個士兵,如果我使用槍裝飾他將是shoot()
- 槍的功能。如果我明天用劍裝飾他,他不僅可以shoot()
,而且還有cut()
- 劍的功能。我可以用裝飾模式實現它嗎? 對於任何誤解和感謝您的幫助,我很抱歉。
裝飾者的要點不是添加方法。這是爲了使裝飾對象的方法做更多*或*不同*。裝飾器應該與正在裝飾的對象具有相同的類型。例如,一個BufferedReader裝飾另一個讀者。它的read()方法委託給裝飾閱讀器的read()方法,但在頂部添加緩衝區。 –
@JBNizet,我認爲這應該是一個答案,而不是評論。 –
@GrzegorzGórkiewicz那不會回答這個問題。 – CKing