设计模式之备忘录模式

406 阅读2分钟

备忘录模式定义

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

  • 该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态。备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问, 目的是为了保护被保存的这些对象状态的完整性以及内部实现不向外暴露

涉及角色:

  • 发起人:负责创建一个备忘录,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。发起人能够依据须要决定备忘录存储自己的哪些内部状态。

  • 备忘录:负责存储发起人对象的内部状态,并能够防止发起人以外的其它对象訪问备忘录。备忘录有两个接口:管理者仅仅能看到备忘录的窄接口,他仅仅能将备忘录传递给其它对象。发起人却可看到备忘录的宽接口。同意它訪问返回到先前状态所须要的全部数据。

  • 管理者:负责存取备忘录,不能对内容进行訪问或者操作

备忘录模式的实现

实例:游戏存档

<?php

 //创建一个备忘录用来从初 角色状态
    class RoleStateMemento
    {
        public $Life_Value;
        public function __construct($Life)
        {
            $this->Life_Value = $Life;
        }
    }

// 游戏角色
class GameRole
{
        public $LifeValue;
        /**
        * 构造方法 初始化状态
        */
        function __construct()
        {
            $this->LifeValue = 100;
        }
        // 保存角色状态
        public function Save()
        {
            return (new RoleStateMemento($this->LifeValue));
        }
        public function Recovery($_memento)
        {
            $this->LifeValue = $_memento->Life_Value;
        }
      // 开始玩嘞
        public function Display(){
            $this->LifeValue -= 10; // 每次被攻击减少10点生命值
        }
        public function Dump()
        {
            echo '当然角色状态:<br/>';
            if ($this->LifeValue <= 0) {
                echo '你已经挂了!<br>';
            } else {
                echo "生命值:{$this->LifeValue}<br>";
            }
        }
    }

    class RoleStateManger
    {
        public $Memento;
    }

    $Role = new GameRole();
    $RoleMan = new RoleStateManger();
    $RoleMan->Memento = $Role->Save();
    $num = 1; // 记录回合数
     for ($i=0; $i<10; $i++){
        echo "-------------第{$num}回合------------<br/>";
        $Role->Display();
        $Role->Dump();
        $num++;
        # 在第5个回合的时候老婆杀来了,你经常会在战斗中存档一次,防止老婆拉电闸
        if($num == 5){
            $RoleMan2 = new RoleStateManger();
            $RoleMan2->Memento = $Role->Save();
        }
    }
    
    $Role->Recovery($RoleMan->Memento);
    $Role->Dump();
    $Role->Recovery($RoleMan2->Memento);
    $Role->Dump();