デザインパターンとは、システム設計におけるクラスやインターフェースの関係に名前をつけたものです。 GoFの23のパターンが有名です。デザインパターンというのは、どんなパターンなのか、パターンの目的は何かということを覚えることが非常に重要なのですが、これを実際に適用しようとした場合に、いつ適用していいかが見えてこないとお話になりません。

そこで、自分の勉強も兼ねつつ、パターンの実践時における使用場所や、パターンを適用するきっかけを見つけられるようにメモしておきます。

16番目のパターンは実行可能なアクション(コマンド)をオブジェクトとして扱い、コマンドの詳細をカプセル化するCommandパターンです。

Commandパターン

Commandパターンは、実行可能なアクション(コマンド)をオブジェクトとして扱い、コマンドの詳細をカプセル化するパターンです。コマンドの追加や削除に対して柔軟になります。

Commandのクラス図

Commandパターンの動き

Commandパターンは、ユーザが実行する処理をCommandオブジェクトにカプセル化するところから始まります。イベントが発生すると、InvokerがCommandオブジェクトのexecuteを呼び出します。Commandオブジェクトは、アクションを実行した後、Receiverに結果を伝えます。

Commandパターンが有効に働く場面

  • UNDO、ログの記録、トランザクションをサポートしたいとき
  • 非同期でアクションを実行したい場合。キューなどに入れて異なるタイミングで実行する
  • イベントとアクションを分離したい場合。Webアプリケーションの作成時に利用

Commandの考え方

Commandは相互作用による振る舞いを分離しているパターンです。クラス図を見ると分かるように、開放閉鎖の原則(OCP) に乗っ取っています。役割(ロール)ベースで考えると、何か処理したいものがあり(Command)、イベントがどこかで起こり(Invoker)、その結果がどこかに伝わる(Receiver)がある場合、Commandパターンが使えると言うことになります。

イベント駆動型の設計を行う場合に使えると言えます。Webアプリケーション、GUIを伴ったアプリケーション、対話型のアプリケーションと利用範囲はさまざまです。バッチ処理にも使えます。Commandパターンのすごいところは、処理をカプセル化しているため、イベントの起こり方には左右されない点です。上記のどのアプリケーションでも、Commandの部分のロジックは変更する必要がありません。

Commandパターンの例

Commandパターンが使われている例として、JavaのWebアプリケーションフレームワークであるStrutsなどが有名です。Webアプリケーションを作るときは、Commandパターンを知らず知らずのうちに使っていると思います。

メッセージング処理などもCommandパターンの利用例の一つです。非同期処理をキューに溜め込んで、順次処理をしていくといった方法で使われています。

実装サンプルと参考文献

  • 日立ソフト(Commandパターン) 日立ソフト

  • Skeleton of GOF’s Design Pattern(JavaとC++のサンプルがあります) Commandの骸骨

  • デザインパターンのお勧め書籍

  • 独習シリーズのデザインパターン編。デザインパターンを一人でも学べます。
  • Sun Microsystemのお墨付き。GoF以外のパターンも学べます。
  • UMLを使って、オブジェクト指向のいいとこ取りができます。
  • デザインパターンだけではなく、ソフトウェア設計の原則やプラクティスまで学びたい人におすすめ