cheka.jp 超不定期で更新する写真達。お口直しにどうぞ。

[写経] PHPで学ぶデザインパターン16

— 注意 —
PHPによるデザインパターンの写経ですが、まんま書くと問題があるのでアウトプットとして備忘録メモです

データ復元のパターンをみてみます。

Mement、スナップショットを取る

振る舞い + オブジェクト
PHPではデータ保存にDBやSessionを使うなど工夫が必要だと思いますが、最近はシングルページアプリケーションが流行っているのでjavascriptで使い方を覚えると活用できそうな気がします。
画面から入力されるコメントの保存と復元をやってみたいと思います。

Mement(スナップショット)クラス

コメントのスナップショットを保持するクラスです。

/*
Mementクラス
*/
class DataSnapShot
{
	//保存したコメント
	private $comment;

	//コンストラクタ
	public function __construct($comment) {
		$this->comment = $comment;
	}

	//コメントの取得
	protected function getComment()
	{
		return $this->comment;
	}
}

Mement(スナップショット)管理クラス

コメントを保持するクラスです。

/*
Mement管理クラス
*/
final class Data extends DataSnapShot
{
	//保存したコメント
	private $comment;

	//コンストラクタ
	public function __construct() {
		$this->comment = array();
	}

	//Mementを生成する
	public function takeSnapShot()
	{
		return new DataSnapShot($this->comment);
	}

	//復元
	public function restoreSnapShot(DataSnapShot $snapShot)
	{
		$this->comment = $snapShot->getComment();
	}

	//コメントの追加
	public function addComment($comment)
	{
		$this->comment[] = $comment;
	}

	//コメントの取得
	public function getComment()
	{
		return $this->comment;
	}

	//コメントの表示
	public function printComment()
	{
		foreach ($this->comment as $val) {
			print($val."\n");
		}
		print "\n";
	}
}

操作クラス

MementへのAPIを提供しるクラスです。

/*
操作クラス
*/
class DataCaretaker
{
	//スナップショット
	private $snapShot;

	//スナップショットの保存
	public function setSnapShot(Data $snapShot)
	{
		$this->snapShot = clone $snapShot;
	}

	//スナップショットの取得
	public function getSnapShot()
	{
		return $this->snapShot;
	}
}

使ってみる

//データ保存用
$data = new Data();
//データ操作用
$dataCaretaker = new DataCaretaker();

//コメントを追加して表示する
$data->addComment("コメント1");
$data->addComment("コメント2");
$data->printComment();

//スナップショットを取ってからコメントを追加する
$dataCaretaker->setSnapShot($data);
$data->addComment("コメント3");
$data->addComment("コメント4");
$data->printComment();

//スナップショットを復元sいてコメントを表示する
$data = $dataCaretaker->getSnapShot();
$data->printComment();
$php mement.php
コメント1
コメント2

コメント1
コメント2
コメント3
コメント4

コメント1
コメント2

オブジェクトが参照渡しになるのでclone $snapShotで値渡しにしています。
直近のコメント一覧のみですが、タイムスタンプをキーにしてある程度の履歴を保持できるように改善すると使い道が見えそうです。