HISTORYパターン

目的

オブジェクトの更新履歴を保存する。更新履歴から過去のオブジェクトを取り出すことができる。

動機

ネットワーク管理などの業務アプリケーションにおいて、日々どのような業務を行いどのように業務状態が変化していったかを記録することは良くあるが、通常、各業務オブジェクトごとの固有の形式で保存することになる。
しかし、この方法には問題がある。過去のデータを取り出したい時に各業務オブジェクトごとにログを辿っていくプログラムコードが必要になり、アプリケーションは複雑化する。さらにログの保存が不完全な場合には過去のバージョンを取得することさえ不可能になる。
そこで、次のような統一な方法で更新履歴を保存し取り出すことができるようにする。

Hoge x2 = x1.clone();

// ... x2を編集 ...

Delta d12 = new Delta(x1,x2);

// ... x2とd12を保存 ...

...

// Hogeの昔のバージョンx1を取り出したいとき

Hoge x1 = d12.prev(x2);

ここでHogeは業務クラスを表し、Deltaは差分保存用のクラスである。
Deltaのprevメソッドによって、時間軸を遡り過去のバージョンを取得するこができる。

適用可能性

Historyパターンは、以下のような場合に有効である。

  • 過去のオブジェクト状態を取得しなければならない場合。
  • 複数のオブジェクトの履歴を保存しなければならない場合。
  • 履歴の保存サイズを少なくしなければならない場合。

構造

構成要素

BussinessObjectクラス
  • 履歴を保存しなければならない対象。
  • 複製可能でなければならない。
ReflectionSupportedインタフェース
  • 内部構造が外部から参照可能である。
Deltaクラス
  • あるBussinessObjectの2つのバージョンの差分を保存する。

協調関係

結果

2つのバージョンの履歴を簡単にとることができる。
履歴から過去のバージョンを復元することが簡単にできる。
ビジネスオブジェクトの複製可能に気を使う。

・・・まだ書き途中。こういうの書くのに日記って適してないかも?