0

コマンドパターンには、InvokerCommandReceiverの3つの主要コンポーネントがあります。クライアントは、 Receiverで特定のメソッドを呼び出すために必要な情報をInvokerに提供しますが、実際にを呼び出すのはCommandオブジェクト(Receiverによって格納されます)です。MM

a)CPを実装するには、コマンドの数を増やしてもInvokerクラスを変更する必要がないように、 Invokerのロジックをコマンドの数から切り離す必要があります。これを行うには、CommandオブジェクトとInvokerを抽象化(つまりインターフェイス)に依存させます。

そのため、CPはDIPの特定の実現だけではありませんか?

b)CPが実際にDIPの実装である場合、 CPが他のタイプのDIP実装と正確に異なる点は何ですか?つまり、 DIPの他のすべての実装にもInvokerオブジェクト(つまり、より高いレベルのモジュール)、Commandオブジェクト(つまり、より高いレベルのモジュールに動作を提供する依存関係)があり、Receiverは依存関係オブジェクト(つまり、下位レベルのモジュール)呼び出し?

ありがとうございました


編集:

a)

依存オブジェクトは依存関係をフィールドとして保持し、それを後続のすべてのメソッド呼び出しに使用します。

そして、依存オブジェクトがこの依存関係をフィールドとして保持しない場合、したがって、すべてのsubsequnt呼び出しにそれを使用するのではなく、常に新しい依存関係オブジェクトを受け取ります。次に、DIではなくCPがあると主張できますか?

逆もまた同様です。Invokerが常に同じコマンドオブジェクトを呼び出す場合、実際に実行する作業コマンドオブジェクトに関係なく、CPではなくDIがあると主張できますか?

b)あなたが言いたいことは理解していますが、何が何かを振る舞うのか、何がコマンドなのかを区別するのに、まだいくつかの大きな問題があります。私の見解では、コマンドをInvokerに渡すことは、依存オブジェクトがそのジョブを実行するために必要な動作を注入することとして解釈することもできます。それは本当にとても明確ですか、それともより主観的ですか?したがって、オブジェクトによって実行される作業がコマンドであるか動作であるかをどのように判断するのでしょうか。

4

1 に答える 1

1

コマンドパターンは、オブジェクトに何も注入しません。コマンドをメソッドに渡します。メソッドはコマンドを呼び出します(通常は1回のみ)。

依存性注入は、依存性(つまり、依存オブジェクトがその仕事をするために必要な別のオブジェクト)を注入します。依存オブジェクトは依存関係をフィールドとして保持し、それを後続のすべてのメソッド呼び出しに使用します。

例えが必要な場合、依存性注入は、料理人にオーブンを与えて、料理人がすべての料理を準備できるようにすることです。コマンドパターンは、誰かが料理を要求するたびに準備する材料のボウルを彼に与えることで構成されています。

編集:

コマンドパターンは、単一のメソッド(execute())を定義するだけの抽象クラスのインターフェイスの実装を渡すことで構成されます。呼び出し側は、コマンドが何を実行できるか、またはその役割が何であるかを知らずに、このコマンドを呼び出します。パターンの原則は、コマンドインターフェイスのいくつかの異なる実装(たとえば、上、右下、左)を渡すことができるようにすることです。呼び出し元は、これらのインスタンスを保存して後で実行したり、保存して元に戻したりする場合があります。

依存関係の注入は、依存関係オブジェクトが初期化されるときに、依存関係を1回渡すだけです。この依存関係は、依存オブジェクトが独自のビジネスロジックの一部として使用する、明確に識別された多数のメソッドを提供します。

どちらもオブジェクトと呼び出しメソッドを使用しますが、目標は大きく異なります。

だからあなたのポイントa)への私の答えは次のようになります:はいまたはいいえ、それは異なります。オブジェクトが一般的なオブジェクトであり、さまざまなメソッドを提供し、依存オブジェクトが必要に応じて呼び出す、1つのメソッドのみを使用する単一のインターフェイスの多くの実装の1つではない場合、コマンドを構成しません。

b)http://en.wikipedia.org/wiki/Command_patternのサンプルコードを読んでください。わかりやすくなります。

于 2012-07-06T21:19:59.800 に答える