Command パターン - コマンドパターン
2008/06/18 00:31Update
CommandパターンはGoFによる23種類のデザインパターンの振る舞いに関連するパターンの一つです。Commandパターンは「メソッドの呼出し」という振る舞いをCommandと呼ばれるクラスとしてカプセル化します。
概要
オブジェクト指向のプログラミング(OOP)では、オブジェクト同士の呼び出しは次のようになります。
1、呼ばれる側のオブジェクトのインスタンスを作成
2、パラメータの設定
3、呼び出す
Commandパターンはこのような「呼出し」をCommandクラスとしてカプセル化にします。即ち、オブジェクトAはBを呼ぶとした場合、Commandパターンでは、Commandというオブジェクトの用意して、AはCommandを呼び、そして、Bのパラメータの設定や、Bを呼ぶための前処理/後処理などをすべてCommandオブジェクトの中に行うようにします。
Command パターンの使用シーン
◇ 呼び出しは煩雑または多数であること。「呼出し」をCommandとしてカプセル化することで、再利用可能になります。
◇ パラメータの処理が必要。
◇ 前処理/後処理が必要。ログ、キャッシュ、取り消しサポートなど。
よくあるシーンの例:
Multi-level undo(複数のレベルの [Undo] 機能)
操作しても、呼ぶ前の状態に戻したい場合、「呼び出し」の状態をCommandオブジェクトによって保存したり、そして「Undo」したりすることができます。例:ユーザのコマンド(呼び出し)をstackに保存して、「Undo」の場合、stackから保存された「コマンド」をpopupしてundoメソッドを実行するだけで「Undo」ができます。
Transactional behavior(トランザクション動作)
一連の操作である一つが失敗した場合、実行前の状態に戻すケースがよくあります。このような場合、Commandオブジェクトによって実行前の状態を保存することによって、簡単にトランザクション動作を実現できます。
Progress bars(プログレスバー)
一連の操作で、どこまで実行されたかをユーザに知らせる必要があります。このような場合、commandオブジェクトにgetEstimatedDuration()のようなメソッドを持たせて、プログレスバーの表示ができます。
Wizards(ウィザード)
一つのタスクをウィザードによって完成させたい場合、簡単な方法としてcommandオブジェクトを使ってウィザードをカプセル化します。commandオブジェクトは最初のウィザードページに生成され、ユーザの入力をcommandオブジェクトに保存し、そして“Finish”ボタンを押下時、commandオブジェクトのexecute()を実行してタスクを完成させます。
Thread pools(スレッドプール)
よくある実装方法は、スレッドプールの中のタスクをcommandオブジェクトとして実装します。
Macro recording(マクロの記録)
一つのユーザの操作をcommandオブジェクトとして実装して、“Play back”の場合、単なるcommandオブジェクトを実行するだけです。
Networking(ネットワーキング)
ネットワークを通じてほかのマシンにコマンドを送信
など
Command パターンのクラス図
Command
Command抽象クラス
ConcreteCommand
Commandの具体的な実装クラス。Commandから継承。
Receiver
呼び出し目標クラス
Invorker
InvorkerでCommandオブジェクトを呼び出す。省略可能。
Client
クライアント。呼び出し側
次のページ:Command パターンの使用例
Sponsored Link
- Relative Articles
- ASP.NETでのフロント・コントローラ(Front Controller)実装 - (2009/10/20 15:22)
- Factory Method パターン - ファクトリメソッドパターン - (2008/06/09 22:44)
- Abstract Factory パターン - 抽象ファクトリパターン - (2008/06/10 13:25)
- Singleton パターン - シングルトンパターン - (2008/06/10 15:36)
- Prototypeパターン - プロトタイプパターン - (2008/06/10 17:23)
- Builderパターン - ビルダーパターン - (2008/06/10 19:01)
- Adapter パターン - アダプターパターン - (2008/06/11 11:30)
- Composite パターン - コンポジットパターン - (2008/06/11 16:59)
- Interpreter パターン - インタプリタパターン - (2008/06/13 15:42)
- Chain of Responsibility パターン - 責任の連鎖パターン - (2008/06/14 00:28)