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

声明:本系列博客参考资料《大话设计模式》,作者程杰。

       

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


             UML类图:

             


               角色:        

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

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

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


        核心代码: 

<?php
/**
 * Created by PhpStorm.
 * User: Jang
 * Date: 2015/6/10
 * Time: 9:49
 */

//游戏角色
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;
}


            测试代码:       
<?php
/**
 * Created by PhpStorm.
 * User: Jang
 * Date: 2015/6/10
 * Time: 10:02
 */

header("Content-Type:text/html;charset=utf-8");
//-------------------------备忘录模式------------------------
require_once "./Memento/Memento.php";

//开战前
$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();


        优点:

        1有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。

        2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需要的这些状态的版本。


      缺点:

      1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。

      2、当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。

     


欢迎关注我的视频课程,地址如下,谢谢。


   PHP面向对象设计模式
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下捕获并保存一个对象的内部状态,并在需要时恢复该状态。在软件开发中,备忘录模式通常用于实现撤销操作或者历史记录功能。 下面是一个使用备忘录模式的简单示例,假设我们有一个文本编辑器,用户可以在其中输入文本并进行编辑操作。我们希望实现一个撤销功能,使得用户可以撤销之前的编辑操作。 首先,我们需要定义一个备忘录类,用于保存编辑器的状态: ```python class EditorMemento: def __init__(self, content): self.content = content def get_content(self): return self.content ``` 然后,我们需要定义一个编辑器类,其中包含了一些编辑操作,以及用于保存和恢复状态的方法: ```python class Editor: def __init__(self): self.content = "" def type(self, words): self.content = self.content + " " + words def delete(self, words): if words in self.content: self.content = self.content.replace(words, "") def save(self): return EditorMemento(self.content) def restore(self, memento): self.content = memento.get_content() ``` 最后,我们可以使用这个编辑器类来实现撤销功能: ```python editor = Editor() editor.type("This is the first sentence.") editor.type("This is the second sentence.") saved = editor.save() editor.delete("second") print(editor.content) # 输出:This is the first sentence. editor.restore(saved) print(editor.content) # 输出:This is the first sentence. This is the second sentence. ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

苍穹0113

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

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

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

打赏作者

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

抵扣说明:

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

余额充值