4

私は現在、ソフトウェアデザインコースを受講しています。私自身、ソフトウェアシステムの設計が得意ではなかったので、自分の弱点を修正するのは賢明な方法だと思いました;)

コマンドパターンがどのように機能するかを理解しようとしています。私は例を探し回ってきましたが、それでも困惑しています。パターン内の各クラスの責任は何ですか?ConcreteCommandsは実際にアクションを実行しますか、それとも必要な情報を運び、実際に実行するために適切な宛先に送信しますか?

4

4 に答える 4

4

あるオブジェクトに関連するステップバイステップの説明が記載された紙があるとします。この紙を封筒に入れて封をします。次に、封筒を開いて、イベントが発生したときにここに書かれていることを正確に実行することを知っている友人に封筒を渡します。

この場合、あなたはクライアントです。紙はConcreteCommandです。レシーバーは、あなたが論文で言及したオブジェクトです。そして、Invokerはあなたの友達です。

Invokerを選択して、エンベロープが開かれる条件を選択します。

于 2011-03-23T20:32:07.550 に答える
1

私が理解しているように、コマンドパターンの本質は、実行するアクションのデータをキャプチャすることです(すぐにではなく、適切なタイミングで実行できるようにするため)。今、誰がその行動を実行するかはそれほど重要ではありません。個別のコマンドハンドラークラスの場合もあれば、コマンドクラス自体の場合もあります。

于 2011-03-23T19:57:55.107 に答える
1

私が見たコマンドパターンには2つの異なるバリエーションがあります。

1つ目は、タスクまたはコマンドを実行するために使用される単純なインターフェースです。RunnableJavaインターフェースはそのような例の1つです。実装には、「doSomething()」などの単純なメソッドがあり、そのタスクまたはコマンドをシステム内の別のコンポーネントで実行できます。

コマンドパターンの教科書バージョンは、コマンドの具体的な実装を使用するシステムの他のコンポーネントを説明するところまで行きます。これは、Invoker、Receiver、Clientなどの他の用語の由来です。詳細については、ウィキペディアを参照してください:http: //en.wikipedia.org/wiki/Command_pattern

このデザインパターンを混乱させないでください。「doSomething()」定義のインターフェイスを持つのと同じくらい簡単です。

于 2011-03-23T21:59:35.527 に答える
0

科学的に言えば、コマンドパターンはオブジェクト指向プログラミングランドからのクロージャの実装であり、それに応じて使用する必要があります。

ボタンコントロールがあるとします。ボタンを押すと、何らかのアクションを実行する必要があります。このアクションはConcreteCommandです。これは、関数への単純なポインター(CまたはC ++)である可能性があります。ただし、他のコントロールやユーザー入力などからの追加情報が必要な場合は、それらもどこかにキャプチャする必要があります。このため、この追加情報をキャプチャするオブジェクトがあると便利です。

副作用として、コマンドをコンテナに保存して実行を遅らせたり、実行されたコマンドを追跡したり、後でロールバックしたりすることができます。

于 2011-03-23T21:13:28.833 に答える