欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP设计模式——备忘录模式_PHP教程

程序员文章站 2022-05-31 07:54:25
...

PHP设计模式——备忘录模式

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

UML类图:

PHP设计模式——备忘录模式_PHP教程

角色:

1.发起人(GameRole):负责创建一个备忘录,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。发起人可以根据需要决定备忘录存储自己的哪些内部状态。

2.备忘录(RoleStateSaveBox):负责存储发起人对象的内部状态,并可以防止发起人以外的其他对象访问备忘录。备忘录有两个接口:管理者只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。发起人却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。

3.管理者(GameRoleStateManager):负责存取备忘录,不能对的内容进行访问或者操作。

核心代码:

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 角色状态:
;
        echo 生命力:{$this->liveLevel}
;
        echo 攻击力:{$this->attackLevel}
;
        echo 防御力:{$this->defenseLevel}
;
    }

    //被攻击
    public function BeenAttack()
    {
        $this->liveLevel -= 9.5;
        if($this->liveLevelliveLevel = 0;
            echo 呃,该角色阵亡了!
;
            echo Game Over!
;
            return;
        }

        $this->attackLevel -= 1.1;
        if($this->attackLevelattackLevel = 0;
        }

        $this->defenseLevel -= 0.5;
        if($this->defenseLeveldefenseLevel = 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;
}


测试代码:
GetInitState();
echo ----------------开战前-----------------
;
$ufo->StateDisplay();

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

echo ----------------战斗中-----------------
;
$num=1;
//大战Boss5个回合
for ($i = 0; $i BeenAttack();
    $ufo->StateDisplay();
    $num++;
    //角色阵亡
    if($ufo->liveLevel----------------恢复状态-----------------