5

なぜChain of Responanceを使用する必要があるのですか。すべてのコマンドをコンテナにロードして、コマンドを1つずつ実行できるのはなぜですか。これにより、一連の処理が1つの行で要求されます。 BTW私はそれがCoRよりも優れていると感じます。なぜなら、特定のコマンドを削除したり、実行時に別のコマンドに置き換えたりすることができるのに対し、CoRでは、チェーン内の要素を変更するために、最初の要素を除くチェーン。 (これは、実際には、単一リンクリストです。)Chain of Responsibilityとキューまたはスタック内のコマンド

答えて

1

ちょうどあなたは、具体的にそれを必要とし、あなたがそれを必要とするとき、あなたが知っているだろうというとき

がキュー/スタックを作成します:-)「愚かなそれをシンプルに保つ」ために、あなたはしませんか?あなたのようないくつかの単純なデータ操作をしなければならなかった場合例 - のために

data.clean().format().save(); 

commands.push(new Cleaner(data)); 
commands.push(new Formatter(data)); 
commands.push(new Updates(data)); 
commands.execute(); 

対気づくが、私は新しいデータ構造を作成するために、より多くのコードを書かなければならなかった(コマンドはスタック)。

しかし、それはより戦略的なものであったと言うことができます。例えば、シューティングゲームです。プレイヤーは射殺されたり、殺されたりすることができ、結果はゲームの難易度に応じて決まります。

headShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new KillPlayer()); 

bodyShot = new Command(); 
headShot.push(new FreezePlayer()); 
headShot.push(new BleedPlayer()); 
headShot.push(new LooseHealth()); 

player.onHit = function(hitPoint){ 
    hitPoint.aboveNeck() ? headShot.on(this) : bodyShot.on(this); 
}; 

この場合、実行時に渡して実行できる戦略を作成する必要がありました。

簡単モードでは、bodyShotは最後の要素(LooseHealth)を持たず、headShotは最後の要素としてKillPlayerではなくLooseHealthを持つことがあります。

希望します。

+0

どちらがシンプルですか? CORまたはスタック?私にとっては、どちらも同じsh * tです。 – Narek

+0

大丈夫、上の編集された答えを参照してください – Nishant

+0

あなたは静的 'data.clean()。format()。save();'とスタックを比較しました。しかし、CORのように新しいチェーンを作成することができるように、実行時の変更を両方で行うことができるので、私はスタック対CORを求めていました。 – Narek

0

CoRには1つのリンクリストが必要とは思われません。それは共通の実装かもしれません。メッセージ受信者からメッセージ送信者を切り離す限り、二重リンクリストまたは実質的に他の任意の収集/コンテナを使用することができます。あなたが言うことは、CoRパターンと完全に互換性があると思われます。チェーンを構成する機能を強化しただけです。これは、ハード配線ハンドラの関係と優先順位なし

GoF definitionはチェーンを実装するために私たちを指示していることに注意することが重要です...しかし、私はそれが私たちの選択を制限するべきだと思いませんハンドラのコレクション。


また、責任の連鎖は一連の処理と同じではありません。後者はシーケンシャルオペレーション(すなわち、pipeline)を意味するが、前者は階層的であるが必ずしもシーケンシャルではない。任意の数とハンドラの組み合わせ(またはそれらのどれも)は、単一の要求に応じることができません。

最後に、質問内の「コマンド」という単語の使用がチェーン内のハンドラへの参照であり、Command Patternへの参照ではないと仮定しています。 CoRとコマンドのパターンは、チェーンへの要求に関しては補完的ですが、伝統的にはハンドラのようなコマンドに関してはありません。

関連する問題