0

Javascript でデコレータ パターンを実装しています。

私はウィキペディアでここに例を見てきました

// Class to be decorated
function Coffee() {
    this.cost = function() {
    return 1;
    };
}

// Decorator A
function Milk(coffee) {
    this.cost = function() {
    return coffee.cost() + 0.5;
    };  
}

// Decorator B
function Whip(coffee) {
    this.cost = function() {
    return coffee.cost() + 0.7;
    };
}

// Decorator C
function Sprinkles(coffee) {
    this.cost = function() {
    return coffee.cost() + 0.2;
    };
}

// Here's one way of using it
var coffee = new Milk(new Whip(new Sprinkles(new Coffee())));
alert( coffee.cost() );

// Here's another
var coffee = new Coffee();
coffee = new Sprinkles(coffee);
coffee = new Whip(coffee);
coffee = new Milk(coffee);
alert(coffee.cost());

ここで私の質問は、パターンがまだデコレータ パターンであることです。親クラスが cost() 関数の最初または最後に呼び出されるかどうかは重要ですか?

確かに、これは各デコレータの動作に依存することを認識しています...たとえば、デコレータで加算または減算ではなく乗算または除算を行っている場合、もちろん異なる結果が保証されます。

しかし、前の段落で述べた理由以外に、前後に電話をかける理由はありますか?

4

4 に答える 4

1

それはどうでもいい事です。デコレーターは、オブジェクトの振る舞いを変更することになっています。どのようにそれを行うかは、純粋に実装の問題です。

于 2009-06-05T18:11:27.937 に答える
1

あなたは明らかにプログラミングに興味があり、かなりのスキルを持っていますが、本当のことについて話すのは危険であることに注意してください。プログラミングには簡単な答えはほとんどありません。答えを見つけたと思ったら、誰かがあなたを利用しています。

代わりに、できる限り多くのツールを学び、それらの長所と短所を学び、それらが適切な場合と変更が必要な場合を理解してください。

于 2009-06-05T18:25:38.210 に答える
0

注意してください

new X(new Y(new Z())))

タイプ構造。これにはいくつかの落とし穴があります (私は Java の専門家なので、Java の例をいくつか挙げますが、概念はどこにでも当てはまります)。

  • ネストされたオブジェクトへのアクセス権がありません

    • Java IO オブジェクトをデコレートしていて close() が失敗した場合、ネストされたオブジェクトを閉じる必要がある場合など、必要になる場合があります)
    • 追加のデータを設定する必要がある、または設定したい場合があります
    • ネストされた項目 (new PrintWriter(new StringWriter())) から結果を取得する必要がある場合があります。結果の String を StringWriter から取得する必要があります。
  • 例外 (またはその他の種類のエラー) が発生した場合、報告された行番号に基づいて何が起こったのかを判断するのは困難です。

  • デバッグ時のステップ実行が難しくなります (デバッガーによって異なります)。
  • 真ん中に何かを挿入するのは難しい
  • 真ん中のものを取り除くのは難しい
  • 順番を変えるのは難しい
于 2009-06-05T19:12:52.877 に答える
0

さて、答えが見つかりました。

デザインパターンの本のデコレーターパターンの部分を読み直したところ、次のことがわかりました。

「デコレーターは、残りの仕事を行うために装飾するオブジェクトに委譲する前および/または後に、独自の動作を追加します。」

前後のビットに重点を置いて...

ご迷惑をおかけして申し訳ありません。回答ありがとうございます。

于 2009-06-07T23:44:15.763 に答える