オブジェクト指向設計


Command パターン - コマンドパターン

2008/06/18 00:31Update
TAGS: Command | GoF | デザインパターン | OOD | オブジェクト指向設計

CommandパターンはGoFによる23種類のデザインパターンの振る舞いに関連するパターンの一つです。Commandパターンは「メソッドの呼出し」という振る舞いをCommandと呼ばれるクラスとしてカプセル化します。

Page:  <1|2>

概要


オブジェクト指向のプログラミング(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 パターンの使用例
Page:  <1|2>

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments