デコレータパターンでは、デコレータメソッドの使い方が混乱しています。私はデコレータパターンが基底クラスに関数を追加するために使用されることを学びました。しかし、私は最も外側のデコレータのメソッドだけを呼び出すことができます。したがって、内部デコレータのメソッドをインターフェイスで言及されていない場合はどうすればよいですか。私は英語が上手ではないので、私は自分の質問を示すコードを書く。コントラクトの異なるデコレータパターン
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