SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

デザインパターンを置き換えよう! Javaラムダ式によるシンプルコーディング

ラムダ式でCommandパターンで書かれたコードをシンプルにする ~ ラムダ式使いへの第一歩

デザインパターンを置き換えよう! Javaラムダ式によるシンプルコーディング 第1回


Commandパターンの概要

 前置きが長くなりましたが、ここから本連載の本題に入ります。連載初回である今回は、Commandパターンをラムダ式に置き換えてみます。

 Commandパターンは、動作をコマンドオブジェクトとして表すパターンです。典型的な Commandパターンのプログラムには、図1に示すようなクラスおよびインタフェースが登場します。

図1 Commandパターンのクラス図
図1 Commandパターンのクラス図

 

 それぞれのクラス、インタフェースの役割は次のとおりです。

  • Command:動作を表すコマンドオブジェクトのインタフェース
  • ConcreteCommand:具体的な動作を表すコマンドオブジェクトのクラス
  • Receiver:動作の対象となるオブジェクトのクラスあるいはインタフェース
  • Invoker:登録されたコマンドオブジェクトを用いて動作を起動するクラス
  • Client:コマンドオブジェクトを生成して Invoker に登録するクラス

 実際のプログラムでは、複数の動作を実装するために、ConcreteCommand に相当するクラスが複数存在することもよくあります。

 典型的な Commandパターンのプログラムは、図2に示すようなシーケンスで動作します。

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

 

 すなわち、Commandパターンのプログラムはおおまかに次の2ステップで動作します。

 1. Client がコマンドオブジェクトを作成し、Invoker に登録する2. Invoker を通じてコマンドオブジェクトが表す動作を起動する

 Commandパターンを用いている例としては、Java標準の並列処理フレームワークである「Executor」が挙げられます。Executorフレームワークでは、非同期的に実行される動作を「タスク」という単位で表します。このタスクがコマンドオブジェクトであると考えられます。タスクは「エクゼキュータ」に登録されます。タスクを実行するためのスレッドを作成・終了したり、タスクをスレッドに割り当てたりするのは、エクゼキュータの仕事です。このExecutorフレームワークの中で、Commandパターンに登場するそれぞれの役割は次のようなクラス、インタフェースが担っています。

  • Command:タスクを表す Callable インタフェースおよび Runnable インタフェース
  • ConcreteCommand: Callable インタフェースや Runnable インタフェースを実装してタスクを表すクラス
  • Invoker:エクゼキュータを表す Executor インタフェースを実装する各クラス
  • Client:エクゼキュータにタスクを登録するクラス
  • Receiver:GUIコンポーネントやビューモデルなど、プログラムによって異なる

 Executorフレームワークの他にも、JavaFXやSwingのようなGUIツールキットなども、Commandパターンを用いる典型的な例です。GUIツールキットでは、ボタン押下などのイベントを処理するイベントハンドラがコマンドオブジェクトにあたります。

 Executorフレームワークや、JavaFX、SwingのようなGUIツールキットは、Commandパターンを用いることで、次のような設計意図を実現していると考えられます。

  • フレームワークやGUIツールキットが、コマンドオブジェクトによって表現される具体的な動作を知っている必要がない
  • コマンドが登録されるタイミングと、コマンドが実行されるタイミングが分離できる

 より高度な応用例としては、実行されたコマンドを記録しておくことにより、アンドゥ、リドゥのような機能を実現することが挙げられます。

次のページ
亀シミュレータ(Commandパターンバージョン)

この記事は参考になりましたか?

デザインパターンを置き換えよう! Javaラムダ式によるシンプルコーディング連載記事一覧

もっと読む

この記事の著者

宮川 拓(ミヤカワ タク)

日本Javaユーザーグループ幹事。東京のシステムインテグレータに勤務。Java VM上で動作する言語である「Kink」を開発中。相撲とアメリカ文学とスコティッシュポップを愛する。 ・ブログ: http://d.hatena.ne.jp/miyakawa_taku/ ・Twitter: @miyakawa_taku

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8300 2015/01/07 17:21

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー