【Commandパターン】GUIイベント処理や履歴管理で用いるデザインパターン【コード例:Java】

前書き:Commandパターンとは 

Commandパターンは、一つの命令(操作)に対応するメソッドを作成するのではなく、命令に対応するクラス(コマンド)を作成する方法です。

命令をクラス化する事によって得られるメリットは、以下の3点があります

Commandパターンのメリット
  • 命令の追加が容易(拡張性が高い)
  • 複数のコマンドを組み合わせて新しいコマンドを作成可能(再利用性が高い)
  • 履歴保存が容易(コマンド単位で保存可能)

Commandパターンは、イベント駆動型アプリ(例:GUIアプリ)で使用される機会が多いです。例えば、マウス押下やドラッグ&ドロップなどのイベントを発生順にキューイングし、各イベントに対応したコマンドでキューを順番に処理していきます。

本記事では、「Commandパターンのクラス図/シーケンス図」を示した後に、「Javaによる実装例」を紹介します。

                

 Commandパターンのクラス図

クラス名 説明
Invoker Commandを起動するクラス。後述のClientクラスに統合される場合もあります。
Client ConcreteCommandクラスを生成します。
Command 命令のインターフェース
ConcreteCommand Receiverクラスのメソッドを用いて、Commandインターフェースのメソッドを実装します。
Receiver 実処理を担当するクラス。

                                                   

 Commandパターンのシーケンス図

                                

Commandパターンの実装例

Commandパターンの例として、

  • ファイルの存在を確認するコマンド
  • ファイルを作成するコマンド
  • 複数のコマンドを連続実行するマクロコマンド

を実装し、それらの実行結果を後述します。

紹介するサンプルコードは、クラス図で表すと以下の構成になります。

複数のコマンドを処理するMacroCommandクラスは、Commandインターフェースを実装したクラスをリスト形式で保持し、リストの内容を順次実行します。今回の例では、ファイル作成コマンド→ファイル存在確認コマンドの順で処理が実行されるように、実装します。

    

実装例 

                 

実行例

今回の実装例では、存在しないファイル(text.txt)の存在確認を行った後、text.txtを作成し、再度text.txtの存在確認を行います。

なお、最近は関数型言語で用いられるラムダ式(JavaもSE 8からサポート済み)を用いれば、Commandデザインパターンを用いずに同様の内容をよりシンプルに実装できます。

                      

他のデザインパターンに関して

GoFデザインパターン(23種類)に関しては、以下の記事でまとめてあります。

【オブジェクト指向】全23種類のGoFデザインパターンに関する説明と参考書籍

                     

おすすめ

1件の返信