文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP中的备忘录模式是干什么的

2023-06-20 17:23

关注

本篇内容主要讲解“PHP中的备忘录模式是干什么的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP中的备忘录模式是干什么的”吧!

备忘录,这个名字其实就已经很形象的解释了它的作用。典型的例子就是我们原来玩硬盘游戏时的存档功能。当你对即将面对的大BOSS有所顾虑时,一般都会先保存一次进度存档。如果挑战失败了,直接读取存档就可以恢复到挑战BOSS前的状态,然后你就开开心心的再去练一会级回来解决这个大BOSS就好了。不过,为了以防万一,在挑战BOSS之前存个档总是好的。另外一个例子就是我们码农们天天要用到的代码管理工具Git或者Svn了。每次的提交都像是一次存档备份,当新代码出现问题的时候,直接回滚恢复就行了。这些,都是备忘录模式的典型应用,下面就一起来看看这个模式吧。

Gof类图及解释

GoF定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

GoF类图:

PHP中的备忘录模式是干什么的

代码实现:

class Originator{    private $state;    public function SetMeneto(Memento $m)    {        $this->state = $m->GetState();    }    public function CreateMemento()    {        $m = new Memento();        $m->SetState($this->state);        return $m;    }    public function SetState($state)    {        $this->state = $state;    }    public function ShowState()    {        echo $this->state, PHP_EOL;    }}

原发器,也可以叫做发起人。它有一个内部状态(state),这个状态可以在不同的情况下进行改变。当某一个事件发生时,需要将这个状态恢复到原先的状态。在这里,我们有一个CreateMemento()用于创建一个备忘录(存档),有一个SetMeneto()用于还原状态(读档)。

class Memento{    private $state;    public function SetState($state)    {        $this->state = $state;    }    public function GetState()    {        return $this->state;    }}

备忘录,非常简单,就是用于记录状态。将这个状态以对象的形式保存,就可以让原发器非常方便地创建很多存档用于记录各种不同的状态。

class Caretaker{    private $memento;    public function SetMemento($memento)    {        $this->memento = $memento;    }    public function GetMemento()    {        return $this->memento;    }}

负责人,也叫做管理者类,保存备忘录,当需要的时候从这里取出备忘录。它只负责保存,不能修改备忘录。在复杂的应用中,可以将这里做成列表,就像游戏中可以选择性的展现多条存档记录供玩家选择。

$o = new Originator();$o->SetState('状态1');$o->ShowState();// 保存状态$c = new Caretaker();$c->SetMemento($o->CreateMemento());$o->SetState('状态2');$o->ShowState();// 还原状态$o->SetMeneto($c->GetMemento());$o->ShowState();

客户端的调用中,我们的原发器初始化状态后进行了保存,然后人为的更改了状态。这时只需要通过负责人将状态还原回来就可以了。

Mac的时光机功能大家有了解过吧,可以将电脑恢复到某一时间点的状态下。其实windows的ghost也是类似的功能。我们的手机操作系统上也决定开发这样的一个功能。当我们点击时光机备份时,将手机上所有的资料、数据、状态信息都压缩保存起来,如果用户允许的话,我们将这个压缩包上传到我们的云服务器上避免占用用户的手机内存,否则就只能保存到用户的手机内存中了。当用户的手机需要恢复到某个时间点,我们将所有的时光机备份列出,用户只需要用手指轻轻一按就可以把手机系统状态恢复到当时的样子了,是不是非常方便!!

完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/17.memento/source/memento.php

实例

这次又回到短信发送的例子上来。通常我们做短信或者邮件发送这些功能时,会有一个队列从数据库或者缓存中读取要发送的内容进行发送,如果成功了就不管了,如果失败了会将短信的状态改成失败或者重发。在这里,我们直接将它改回到之前未发送的状态然后等待下次发送的队列再次执行发送。

短信发送类图

PHP中的备忘录模式是干什么的

完整源码:https://github.com/zhangyue0503/designpatterns-php/blob/master/17.memento/source/memento-message.php

<?phpclass Message{    private $content;    private $to;    private $state;    private $time;    public function __construct($to, $content)    {        $this->to = $to;        $this->content = $content;        $this->state = '未发送';        $this->time = time();    }    public function Show()    {        echo $this->to, '---', $this->content, '---', $this->time, '---', $this->state, PHP_EOL;    }    public function CreateSaveSate()    {        $ss = new SaveState();        $ss->SetState($this->state);        return $ss;    }    public function SetSaveState($ss)    {        if ($this->state != $ss->GetState()) {            $this->time = time();        }        $this->state = $ss->GetState();    }    public function SetState($state)    {        $this->state = $state;    }    public function GetState()    {        return $this->state;    }}class SaveState{    private $state;    public function SetState($state)    {        $this->state = $state;    }    public function GetState()    {        return $this->state;    }}class StateContainer{    private $ss;    public function SetSaveState($ss)    {        $this->ss = $ss;    }    public function GetSaveState()    {        return $this->ss;    }}// 模拟短信发送$mList = [];$scList = [];for ($i = 0; $i < 10; $i++) {    $m = new Message('手机号' . $i, '内容' . $i);    echo '初始状态:';    $m->Show();    // 保存初始信息    $sc = new StateContainer();    $sc->SetSaveState($m->CreateSaveSate());    $scList[] = $sc;    // 模拟短信发送,2发送成功,3发送失败    $pushState = mt_rand(2, 3);    $m->SetState($pushState == 2 ? '发送成功' : '发送失败');    echo '发布后状态:';    $m->Show();    $mList[] = $m;}// 模拟另一个线程查找发送失败的并把它们还原到未发送状态sleep(2);foreach ($mList as $k => $m) {    if ($m->GetState() == '发送失败') { // 如果是发送失败的,还原状态        $m->SetSaveState($scList[$k]->GetSaveState());    }    echo '查询发布失败后状态:';    $m->Show();}

说明

到此,相信大家对“PHP中的备忘录模式是干什么的”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯