php与设计模式-备忘录模式

备忘录模式

又叫做快照模式或Token模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

Demo

<?php 
   /**
    * Created by PhpStorm.
    */ 

   //游戏角色 
   class GameRole 
   { 
       #region 游戏角色状态属性(生命力、攻击力、防御力) 
       public $liveLevel; 

       public $attackLevel; 

       public $defenseLevel; 
       #endregion 

       //保存状态 
       public function SaveState() 
       { 
           return (new RoleStateMemento($this->liveLevel,$this->attackLevel,$this->defenseLevel)); 
       } 

       //恢复状态 
       public function RecoveryState(RoleStateMemento $_memento) 
       { 
           $this->liveLevel = $_memento->liveLevel; 
           $this->attackLevel = $_memento->attackLevel; 
           $this->defenseLevel = $_memento->defenseLevel; 
       } 

       //------------其他属性及操作-------------- 
       //获得初始状态 
       public function GetInitState() 
       { 
           $this->defenseLevel = 100; 
           $this->attackLevel = 100; 
           $this->liveLevel = 100; 
       } 

       //状态显示 
       public function StateDisplay() 
       { 
           echo "角色状态:<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; 
           } 
       } 
       } 

   //角色状态存储箱类 
   class RoleStateMemento 
   { 
       public $liveLevel; 
       public $attackLevel; 
       public $defenseLevel; 

       public function RoleStateMemento($_ll,$_al,$_dl) 
       { 
           $this->liveLevel=$_ll; 
           $this->attackLevel=$_al; 
           $this->defenseLevel=$_dl; 
       } 
   } 

   //游戏角色状态管理者类 
   class RoleStateManager 
   { 
       public $memento; 
   } 

//开战前 
$ufo = new GameRole(); 
$ufo->GetInitState(); 
echo "<span style='color:#ff0000'>----------------开战前-----------------</span><br/>"; 
$ufo->StateDisplay(); 

//保存进度 
$roleMan = new RoleStateManager(); 
$roleMan->memento = $ufo->SaveState(); 

echo "<span style='color:#ff0000'>----------------战斗中-----------------</span><br/>"; 
$num=1; 
//大战Boss5个回合 
for ($i = 0; $i <13;$i++ ) 
{ 
   echo "-------------第{$num}回合-------------<br/>"; 
   $ufo->BeenAttack(); 
   $ufo->StateDisplay(); 
   $num++; 
   //角色阵亡 
   if($ufo->liveLevel<=0) 
   { 
       break; 
   } 
} 

echo "<span style='color:#ff0000'>----------------恢复状态-----------------</span><br/>"; 
//恢复之前状态 
$ufo->RecoveryState($roleMan->memento); 
$ufo->StateDisplay(); 

请关注我的订阅号

订阅号.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值