[Go言語]Commandパターンを学ぼう!~Command~

こんにちは、KOUKIです。

この記事では、デザインパターンの一つであるCommandパターンについて紹介します。

デザインパターンまとめ

シチュエーション

Commandパターンは、オブジェクト(Go言語ではインスタンス)へ送る要求をオブジェクト化し、それを複数組み合わせて使うことができるパターンです。

例えば、計算機を例にこのパターンの使い方を考えてみましょう。

Calculator構造体は、Add/Subtract/Multiply/Divideの4つのメソッドを実装しています。通常であれば、下記のようにインスタンス化をして、それぞれのメソッドを呼び出すことになります。

Commandパターンの適用

Commandパターンは、オブジェクト(インスタンス)への要求自体をオブジェクトにするパターンです。ここでの要求は、計算処理(Add/Subtract/Multiply/Divide)を指します。

シチュエーションのサンプルコードに、Commandパターンを適用してみましょう。

Commandインターフェースの実装

まず、Commandインターフェースを実装します。

Command Actionの実装

次に、Action(要求)を実装します。

Command構造体の実装

次に、Command構造体を実装します。

Callメソッドの実装

ここが、本記事のポイントです。

ご覧の通り、Actionごとにswitch文で処理分岐をしています。

また、CalculatorCommand構造体は、Calculator構造体をパラメータとして持つので、Add/Subtract/Multiply/Divideの4つのメソッドを呼び出すことが可能です。

使ってみよう

ここまで実装したコードを使ってみましょう。

NewCalculatorCommandコンストラクタで、Commandをインスタンス化し、Callメソッドを介して処理を呼び出しています。

プログラムを実行してみましょう。

OKですね。

オブジェクトから直接処理を呼び出すのではなく、Commandインスタンスを介して処理を呼び出せました。

Undo Commandパターン

説明は以上!という感じなのですが、このままだと内容が薄いので、Undo Command(計算キャンセル)も実装してみます。

まず、CommandインターフェースにUndoを追加します。

次に、CalculatorCommand構造体にUndoメソッドを実装します。

これをmain関数から呼び出してみましょう。

cmd4だけUndo(計算キャンセル)しました。

OKですね。

機能追加とその役割がわかりやすい気がしますね。

まとめ

今回のサンプルは、シンプルすぎるが故に、Commandパターンで実装するメリットがわかりづらいかったかもしれません。

しかし、オブジェクト(インスタンス)への要求は、特定のCommandを介して行うという縛りを作ると何かしらのメリットを得られるかもしれません。

例えば、システムをShutdownしたい場合、Shutdownコマンドを送ることになると思いますが、Command構造体の要求からのみ有効にする、みたいな使い方もできると思います。

コマンドラインツールを作るときも活躍しそうですね。

それでは、また!

次回

次回は、CommandパターンのComposite Commandを学習します。

Go言語まとめ

ソースコード

Command

Command + Undo

コメントを残す