備忘錄模式
又叫做快照模式或Token模式,在不破壞封閉的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。
Demo
<?php
/**
* Created by PhpStorm.
*/
//游戲角色
class GameRole
{
#region 游戲角色狀態(tài)屬性(生命力、攻擊力、防御力)
public $liveLevel;
public $attackLevel;
public $defenseLevel;
#endregion
//保存狀態(tài)
public function SaveState()
{
return (new RoleStateMemento($this->liveLevel,$this->attackLevel,$this->defenseLevel));
}
//恢復(fù)狀態(tài)
public function RecoveryState(RoleStateMemento $_memento)
{
$this->liveLevel = $_memento->liveLevel;
$this->attackLevel = $_memento->attackLevel;
$this->defenseLevel = $_memento->defenseLevel;
}
//------------其他屬性及操作--------------
//獲得初始狀態(tài)
public function GetInitState()
{
$this->defenseLevel = 100;
$this->attackLevel = 100;
$this->liveLevel = 100;
}
//狀態(tài)顯示
public function StateDisplay()
{
echo "角色狀態(tài):<br/>";
echo "生命力:{$this->liveLevel}<br/>";
echo "攻擊力:{$this->attackLevel}<br/>";
echo "防御力:{$this->defenseLevel}<br/>";
}
//被攻擊
public function BeenAttack()
{
$this->liveLevel -= 9.5;
if($this->liveLevel<=0)
{
$this->liveLevel = 0;
echo "呃,該角色陣亡了!<br/>";
echo "Game Over!<br/>";
return;
}
$this->attackLevel -= 1.1;
if($this->attackLevel<=0)
{
$this->attackLevel = 0;
}
$this->defenseLevel -= 0.5;
if($this->defenseLevel<=0)
{
$this->defenseLevel = 0;
}
}
}
//角色狀態(tài)存儲(chǔ)箱類(lèi)
class RoleStateMemento
{
public $liveLevel;
public $attackLevel;
public $defenseLevel;
public function RoleStateMemento($_ll,$_al,$_dl)
{
$this->liveLevel=$_ll;
$this->attackLevel=$_al;
$this->defenseLevel=$_dl;
}
}
//游戲角色狀態(tài)管理者類(lèi)
class RoleStateManager
{
public $memento;
}
//開(kāi)戰(zhàn)前
$ufo = new GameRole();
$ufo->GetInitState();
echo "<span style='color:#ff0000'>----------------開(kāi)戰(zhàn)前-----------------</span><br/>";
$ufo->StateDisplay();
//保存進(jìn)度
$roleMan = new RoleStateManager();
$roleMan->memento = $ufo->SaveState();
echo "<span style='color:#ff0000'>----------------戰(zhàn)斗中-----------------</span><br/>";
$num=1;
//大戰(zhàn)Boss5個(gè)回合
for ($i = 0; $i <13;$i++ )
{
echo "-------------第{$num}回合-------------<br/>";
$ufo->BeenAttack();
$ufo->StateDisplay();
$num++;
//角色陣亡
if($ufo->liveLevel<=0)
{
break;
}
}
echo "<span style='color:#ff0000'>----------------恢復(fù)狀態(tài)-----------------</span><br/>";
//恢復(fù)之前狀態(tài)
$ufo->RecoveryState($roleMan->memento);
$ufo->StateDisplay();
請(qǐng)關(guān)注我的訂閱號(hào)

訂閱號(hào).png