[Go言語]Mementoパターンを学ぼう2!

こんにちは、KOUKIです。

この記事では、前回に引き続き、デザインパターンの一つであるMementoパターンについて紹介します。

前回

デザインパターンまとめ

Mementoパターンの適用

前回の復習ですが、Memento は「記念品」や「形見」を意味する英単語であり、Memento パターンは、 インスタンスのあるときの状態をスナップショットとして保存しておくことで、 その時のインスタンスの状態を復元することを可能にするもの、となります。

今回は、Bitcoinの送金プログラムを例に、Undo/Redo処理をMementoパターンで実装したいと思います。

※余談ですが、Bitcointの価格がめっちゃ下がってますよね^^;(2021/5 現在)買わなくてよかった。。

Memento構造体

最初に、Memento構造体を実装します。

この構造体が、スナップショット(更新前のBitcoinの状態)になります。

Bitcoin構造体

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

changesプロパティにはMementoを格納し、revisionには、Bitcoinの状態を記録します。

このrevisionを定義することは、changesプロパティに格納されたMementoを指し示す冴えたやり方です。
詳細は、Undo/Redo処理をご覧ください。

Bitcoinコンストラクタ

Bitcoinコンストラクタを実装しましょう。

Bitcoinのchangesパラメータに、初期化時のMemento(スナップショット)を格納しました。

Bitcoinメソッド

前回と同じように、Bitcoinメソッドを実装します。

使ってみよう

まだ、Undo/Redo処理を実装していませんが、ここまで実装したプログラムを使ってみましょう。

OKですね。

Undo処理

Undo処理を実装します。Undo処理とは、revisionを一つ前の状態に戻すことです。

BitcointのchangesプロパティにMementoやrevisionを持たせているので、Undo処理が容易ですね。

Redo処理

最後に、Redo処理を実装します。RedoはUndoの逆で、revisionを一つ先に進めます。

OKですね。revisionとMementoをBitcoinに持たせることで、簡単にUndo/Redo処理が実装できたと思います。

まとめ

インスタンスの状態をプロパティとして残しておくやり方は、面白いですね^^

今まで、このような観点を持って、プログラミングをしたことはありませんでした。

チャンスがあれば、実践で使ってみたいですね!

それでは、また!

Go言語まとめ

ソースコード

コメントを残す