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

こんにちは、KOUKIです。

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

前回は、Commandパターンの概要に触れ、サンプルコードと共に実装方法をみていきました。

本記事では、複数のCommandを組み合わせる(Composite)方法を紹介したいと思います。

前回

デザインパターンまとめ

BitCoin入出金プログラム

Bit Coinの入出金を例に、サンプルコードを実装していきます。

前回紹介したCommandパターンを実装後に、Composite Commandを適用したいと思います。

BitCoin構造体の作成

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

そこで、まずはCommandインスタンスから指令を受け取る構造体を作成します。

Commandパターンの適用

先ほどは、Bitcoin構造体から直接メソッドを呼び出していますが、これをCommandパターンに書き換えます。

ここまでは前回実装したパターンと大体同じなので、サクッと実装しました。

succeededプロパティは、後続のコマンドを実行するかしないか判定する値で、このプロパティにtrueが入っている時だけ、後続のコマンドが実行される仕様です。これは、Composite Commandで使用します。

ここまで実装したプログラムを呼び出してみましょう。

Deposit/Withdraw/String Commandのインスタンスを作成し、Call/Undoで処理を呼び出します。NewBitcoinCommandの第二引数はコマンドのアクションなので、コマンドごとの処理が行えます。

Actionを定義して処理を振り分けるこのパターンは、前にも実装したことがあります。結構便利です。

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

Composite Commandの実装

長かったですが、ようやく事前準備が終わりました。ここから、Composite Commandで実装していきます。

まず、インターフェースに以下のメソッドを追加してください。

続いて、BitcoinCommand構造体に以下のメソッドを追加します。

次に、Commandを蓄積する構造体を作成します。

この構造体には、以下のメソッドを持たせます。

更に、お金を送受信する構造体を作成します。

この構造体のコンストラクタを実装します。

コンストラクタ内で複数のコマンドをインスタンス化し、commandsプロパティに格納しました

最後に、蓄積したコマンドを実行するCallメソッドを実装します。

これは、BitcoinCommand構造体のsucceededプロパティを最終的に見に行っており、Call/Undoメソッドで設定されています。
※NewBitcoinCommandは、NewMoneyTransferCommandのcommandsに複数格納されるので、それぞれのプロパティを見に行きます(わかりにくいですが)

このコードは、以下のように使います。

複数の処理を一まとめにしたいときに便利ですね。例えば、トランザクション処理に良さそうです。

まとめ

Composite Commandは、一連の処理の流れを作れるので、用途がある気がしますね。

コマンドラインツールなどで、プロセス毎の処理を作成する機会があると思います。そのプロセスを最終的にどのように処理したいかまとめる時に活躍しそうです。

それでは、また!

Go言語まとめ

ソースコード

Composite Command

コメントを残す