php與設(shè)計(jì)模式-備忘錄模式

備忘錄模式

又叫做快照模式或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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容