はじめに:私たちは、通常の使用には、多くの場合、我々はそれが時間を使用しないことをその入場のコマンドモードの構造と定義を理解していない可能性がある場合、コマンドモード。
例:Winフォームの開発は、我々は多くの場合、ファイルをダウンロードするには、同じインタフェースを使用していますが、同じロジックのダウンロードファイルでないすべての場所が、彼らはその後、インタフェースが同じインターフェイスでダウンロードすることができるとき。
後で再利用インターフェースダウンロード(ダウンロード等、プログレスバーを表示)のために、我々は、多くの場合、ダウンロードインターフェイス、特定のオブジェクトがダウンロードインターフェイスを実行するように設定されている場合に特に使用インターフェイスとして定義された操作を実行します。ダウンロードボタンが押下されると、処理ダウンロードを実行するように設定された特定の実行オブジェクト(受信機)への呼び出し。
次に私たちは通常、不注意将来の交換はプロ仕様の機器を使用するように、コマンドモードに使用する場合、それを振り返ると、コマンドモードとリアライズの具体的な内容を見てみましょう用語を使用することができないだけ。
図1に示すように、リモート・アプリケーション・シナリオ
頭からデザインパターンは、オブジェクトとコマンドモードの構造を説明するために、リモートコマンドモード、レストランの食事を実現する一例として、予約を。明確なロジックに我々は、リモートコントロールに説明するために、2つの、唯一の例を混在させないような方法を説明します。
実行上記遠隔制御は、様々な製造業者の装置(オブジェクト)によって開発された電気スイッチは対応するスイッチ位置内のスロットに挿入された制御制御各種電気スイッチの遠隔制御のための需要は、これらの条件に基づいて、今であり、私たち遠隔制御システムを実装しています。
スイッチは、スイッチの種類に応じたかどうかを決定するために押されたときに単純で粗溶液は、スイッチの識別を行うことができます。他SLOT1場合は減少または変更スイッチスイッチへの増加は比較的貧しい後スロット1 ==ライトかのような形状、そして、()light.on、==テレビは、()tv.onこのコードは、山を表示します。リモートコントロールクラスの設計に関しては、我々はリモコンコードは、特定のベンダークラスを実行する方法について気にすることなく、それをシンプルに保つために試してみましょうということです。だから我々は、我々は、リモートコントロールを実現するためにステップバイステップを尽くすパッケージにコマンドオブジェクトを実行する必要があります。
まず、我々は統一され、コマンド・オブジェクト定義を取ります。
コマンドメソッドを実行実行するだけのシンプルなインターフェース。
パブリックインターフェイスコマンド { コマンドを実行する//メソッド ます。public void)(実行。 }
次に、我々はAを達成するためにライトをオンに
パブリッククラスライト { 上の公共のボイド(){ Console.WriteLineを(「ライトをオン」); } 公共無効オフ() { Console.WriteLineを( "消灯"); } } パブリッククラスLightOnCommand:コマンド { 光光; 公共LightOnCommand(ライト光) { this.light光=。 } ます。public void実行() { light.on(); } }
簡単にするために、我々はそれが唯一のリモートコントロールスイッチ、リモートコントロールが実装すると仮定します。
パブリッククラスSimpleRemoteControl { //スロット コマンドスロット。 ます。public void setCommand(コマンドコマンド) { スロット=コマンド。 } //スイッチが押されました ButtonWasPressedます。public void(){ slot.execute(); } }
テスト
静的な無効メイン(文字列[] args) { SimpleRemoteControlリモートコントロール=新しいSimpleRemoteControl(); //クラスのランプメーカーは、コマンドの受信者に提供するために 光光=新しい光()。 私たちのパッケージの//コマンドオブジェクト、受信者を設定します LightOnCommand lightOnCommand =新しいLightOnCommand(光)。 //オブジェクトに対応するリモートコントロールスイッチのコマンドを設定します remoteControl.setCommand(lightOnCommand)。 remoteControl.ButtonWasPressed(); Console.ReadKey(); }
図2に示すように、コマンドモード、図クラス
上記の例とは、簡単なリモートコントロールを実現し、ファイルのボタン操作は、一般的なアプリケーションのシナリオはコマンドモードを使用できることではありませんダウンロードするには、[はじめに]私たちが話しているインタフェースを確認するコマンドモードを使用していました。
しかし、我々は、クラスを実行するように設計された任意の他のベンダーを持っていない可能性があります一つのことは、私たちは、ロジックは、他の受信者の実行を呼び出さず、コマンド・インタフェース・オブジェクトが直接継承し、実行を実現することがあります。
これは、上記の私たちが実現し、「スマート」コマンドオブジェクトである「だます」コマンドオブジェクトです。このほかに、我々は定義して、後にクラス図を描画するコマンドモードを見てください。
コマンドモード:異なる要求、キューを使用するか、パラメータの他のオブジェクトをログに記録するために、オブジェクトにカプセル化「要求」。コマンドモードも取り消さがサポートされています。
図3に示すように、リモートコントローラ及び失効のマルチスイッチ操作を完了するために
5つのリモートコントロールスイッチがあるとします。私たちは、簡単なリモートコントロールの経験を持って、その後、4つのスイッチ他のコマンドオブジェクトは、私たちはラインに対応する設定します。二つのアレイは、スイッチコマンドに対応するオブジェクトを記録するために定義されています。
パブリッククラスのRemoteControl { コマンド[] onCommands。 コマンド[] offCommands。 公共のRemoteControl() { onCommands =新しいコマンド[5]。 offCommands =新しいコマンド[5]。 コマンドNOCOMMANDは新しいNOCOMMANDを()=; (I ++; I <5 I = 0の整数)のために { onCommands [I] = NOCOMMAND。 offCommands [I] = NOCOMMAND。 } } ます。public void setCommand(int型スロット、コマンドcommandOn、コマンドcommandOff) { onCommands [スロット] = commandOn。 offCommands [スロット] = commandOff。 } //スイッチが押されました 公共のボイドOnButtonWasPressed(int型スロット) { onCommands [スロット] .execute()。 } //オフスイッチ 公共のボイドOffButtonWasPressed(int型スロット) { offCommands [スロット] .execute()。 } //コマンドオブジェクトの配列をプリントアウト パブリックオーバーライド列のToString(){ VAR SB =新しいStringBuilderの( "\ nは------------リモートコントロール----------- \ N"); 以下のために(int型私= 0;私<onCommands.Length; I ++) { sb.Append($ "[スロット{I}] {onCommands [I] .GetType()} \ T {offCommands [I] .GetType()} \ n"); } リターンsb.ToString(); } }
リモートコントロールでNOCOMMAND我々は回避またはオブジェクトが空判定切替コマンドオブジェクトの呼び出しであるか、空のエラーチェックを排除するために、リモートコントローラに対応するスイッチングコマンドオブジェクトを初期化するために、クラスを定義します。
公共のボイドOnButtonWasPressed(int型スロット) { もし(オンデマンド[スロット]!= NULL)) onCommands [スロット] .execute()。 }
多くのデザインパターンでは、我々は、この初期値や空のオブジェクトの使用を見ることができます。そして、時には、空のオブジェクト自体もデザインパターンとして見られています。(フィールが、このコードは、よりエレガントであるO(∩_∩)O)
リモコンが完了し、我々はまだやるために仕事を持っている、それが操作をキャンセルすることです。
我々はまた、メソッドが定義されてアンドゥコマンドインターフェースを元に戻します。
パブリックインターフェイスコマンド { コマンドを実行する//メソッド ます。public void)(実行。 //アンドゥコマンド方式 ます。public voidアンドゥ(); }
その後、我々はLightOffCommandコマンドオブジェクトを追加し、LightOnCommandは元に戻す方法を実現しましょう。
パブリッククラスLightOnCommand:コマンド { 光光; 公共LightOnCommand(ライト光) { this.light光=。 } ます。public void実行() { light.on(); } 公共ボイドアンドゥ(){ light.off(); } } クラスLightOffCommand:コマンド { 光光; 公共LightOffCommand(ライト光) { this.light光=。 } ます。public void実行() { light.off(); } ます。public voidアンドゥ() { light.on(); } }
遠隔操作を追加し、undoCommand UndoButtonWasPressedプロパティストア1の操作で[元に戻す]ボタンをクリックします。
パブリッククラスのRemoteControl { コマンド[] onCommands。 コマンド[] offCommands。 コマンドundoCommand; 公共のRemoteControl() { onCommands =新しいコマンド[5]。 offCommands =新しいコマンド[5]。 コマンドNOCOMMANDは新しいNOCOMMANDを()=; (I ++; I <5 I = 0の整数)のために { onCommands [I] = NOCOMMAND。 offCommands [I] = NOCOMMAND。 } } ます。public void setCommand(int型スロット、コマンドcommandOn、コマンドcommandOff) { onCommands [スロット] = commandOn。 offCommands [スロット] = commandOff。 } //スイッチが押されました 公共のボイドOnButtonWasPressed(int型スロット) { onCommands [スロット] .execute()。 undoCommand = onCommands [スロット]。 } //オフスイッチ 公共のボイドOffButtonWasPressed(int型スロット) { offCommands [スロット] .execute()。 undoCommand = offCommands [スロット]。 } ます。public void UndoButtonWasPressed(){ undoCommand.undo(); } //コマンドオブジェクトの配列をプリントアウト パブリックオーバーライド列のToString(){ VAR SB =新しいStringBuilderの( "\ nは------------リモートコントロール----------- \ N"); 以下のために(int型私= 0;私<onCommands.Length; I ++) { sb.Append($ "[スロット{I}] {onCommands [I] .GetType()} \ T {offCommands [I] .GetType()} \ n"); } リターンsb.ToString(); } }
テスト:
4、補助的な概要
彼は加えました:
①受信機のコマンドモードは、上記「スマート」の前に存在し、コマンドオブジェクトを「だます」する必要はありません、「スマート」なデザインのコマンドオブジェクトであれば、ない、発信者と受信者の間で「だます」デカップリングの度合いなどコマンドオブジェクトは、我々はまだシンプルな時間を使用するために設計された「スマート」オブジェクトを使用することができます。
②例の取り消しは唯一我々はあなたが我々がスタック操作の記録に保存することができアンドゥ何倍にしたい場合は、取り消さ何時間に関係なく、我々はスタックアンドゥtopコマンドの実行からオブジェクトを削除することができ、最後の操作を返します。
多くの場合、コマンドモード要求キュー、要求ログで使用されます。コマンドオブジェクトを取得するためにキューが実行する方法は、任意の特定のチューブを実行しなくても、行を保存するために呼び出されます。
いくつかの例では、ログは、すべての記録された操作を要求するために使用され得る、およびログのクラッシュによるシステム前の状態に復元することができる(失効)。より高度なアプリケーションのために、これらの技術は、トランザクション(トランザクション)の処理にも適用することができます。
さらにノートに柔軟かつポイントとポイントの数によって達成コマンドモードを説明するための簡単なは、私を修正してください場所でどのような理解ではありません。