Memento パターン | デザインパターン
2022年9年28日
デザインパターン
Memento
PHP
オライリージャパンによる Head First シリーズ デザインパターン(第2版)第14章 Memento パターンを、 PHPで書き直してみようという試みです。
MasterGameObject.php
namespace Memento; use Memento\GameMemento; class MasterGameObject { private int $gameState; public function getCurrentState() : GameMemento { $memento = new GameMemento(); $memento->setState($this->gameState); return $memento; } public function restoreState(GameMemento $memento) : void { $this->gameState = $memento->getState(); } public function getState() : int { return $this->gameState; } public function setState(int $gameState) { $this->gameState = $gameState; } }
GameMemento.php
namespace Memento; class GameMemento { private int $savedGameState; public function getState() : int { return $this->savedGameState; } public function setState(int $savedGameState) : void { $this->savedGameState = $savedGameState; } }
index.php
use Memento\MasterGameObject; $mgo = new MasterGameObject(); $mgo->setState(7); echo '進行状況 : レベル ' . $mgo->getState() . "\n"; $saved = $mgo->getCurrentState(); echo '進行状況の保存 : レベル ' . $saved->getState() . "\n"; $mgo->setState(9); echo '進行状況 : レベル ' . $mgo->getState() . "\n"; $saved = $mgo->getCurrentState(); echo '進行状況の保存 : レベル ' . $saved->getState() . "\n"; $mgo->setState(11); echo '進行状況 : レベル ' . $mgo->getState() . "\n"; echo 'プレイヤーが倒されました' . "\n"; echo '進行状況をリストアします' . "\n"; $mgo->restoreState($saved); echo '進行状況 : レベル ' . $mgo->getState() . "\n";
出力結果
進行状況 : レベル 7 進行状況の保存 : レベル 7 進行状況 : レベル 9 進行状況の保存 : レベル 9 進行状況 : レベル 11 プレイヤーが倒されました 進行状況をリストアします 進行状況 : レベル 9