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