返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中的备忘录模式是干什么的
  • 561
分享到

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

2023-06-20 17:06:59 561人浏览 独家记忆
摘要

本篇内容主要讲解“PHP中的备忘录模式是干什么的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中的备忘录模式是干什么的”吧!备忘录,这个名字其实就已经很形象的解释了它的作用。典型的例子就是

本篇内容主要讲解“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();

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

  • 备忘录模式说白了就是让一个外部类B来保存A的内部状态,然后在适当的时候可以方便的还原这个状态。

  • 备忘录模式的应用场景其实非常多,浏览器的回退、数据库的备份还原、操作系统的备份还原、文档的撤销重做、棋牌游戏的悔棋等等

  • 这个模式能够保持对原发器的封装,也就是这些状态需要对外部的对象隐藏,所以只能交给一个备忘录对象来记录

  • 状态在原发器和备忘录之间的拷贝可能带来性能问题,特别是大型对象的复杂繁多的内部状态,而且也会带来一些编码方面的漏洞,比如漏掉某些状态

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中的备忘录模式是干什么的”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: PHP中的备忘录模式是干什么的

本文链接: https://lsjlt.com/news/298496.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP中的备忘录模式是干什么的
    本篇内容主要讲解“PHP中的备忘录模式是干什么的”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP中的备忘录模式是干什么的”吧!备忘录,这个名字其实就已经很形象的解释了它的作用。典型的例子就是...
    99+
    2023-06-20
  • Java备忘录模式是怎样的
    本篇内容介绍了“Java备忘录模式是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!定义与结构   备忘录(Memento)模式又称标记...
    99+
    2023-06-03
  • Python设计模式中的备忘录模式
    目录备忘录模式应用场景代码示例总结备忘录模式 备忘录模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 简单来...
    99+
    2024-04-02
  • Python的备忘录模式怎么应用
    这篇文章主要介绍“Python的备忘录模式怎么应用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python的备忘录模式怎么应用”文章能帮助大家解决问题。备忘录模式备忘录模式,在不破坏封闭的前提下,...
    99+
    2023-06-29
  • 怎样深入理解Java设计模式的备忘录模式
    本篇文章为大家展示了怎样深入理解Java设计模式的备忘录模式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、什么是备忘录模式定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这...
    99+
    2023-06-25
  • .Net行为型设计模式之备忘录模式怎么实现
    这篇文章主要讲解了“.Net行为型设计模式之备忘录模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.Net行为型设计模式之备忘录模式怎么实现”吧!一、动机(Motivate)我们看...
    99+
    2023-06-30
  • php中Codeigniter的mvc模式是什么
    这篇文章将为大家详细讲解有关php中Codeigniter的mvc模式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。...
    99+
    2023-06-14
  • PHP中的桥接模式是什么
    这篇文章主要讲解了“PHP中的桥接模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的桥接模式是什么”吧!桥接模式,在程序世界中,其实就是组合/聚合的代名词。为什么这么说呢?熟...
    99+
    2023-06-20
  • PHP中的代理模式是什么
    本篇内容介绍了“PHP中的代理模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代理人这个职业在中国有另外一个称呼,房产经济人、保险经...
    99+
    2023-06-20
  • PHP中的享元模式是什么
    本篇内容介绍了“PHP中的享元模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!享元模式,“享元”这两个字在中文里其实并没有什么特殊的...
    99+
    2023-06-20
  • PHP中的门面模式是什么
    本篇内容介绍了“PHP中的门面模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!门面模式,也叫外观模式。不管是门面还是外观,都是我们对...
    99+
    2023-06-20
  • PHP中的策略模式是什么
    这篇文章主要讲解了“PHP中的策略模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的策略模式是什么”吧!策略模式,又称为政策模式,属于行为型的设计模式。Gof类图及解释GoF...
    99+
    2023-06-20
  • C#备忘录人生存档的设计模式实例
    目录C#备忘录设计模式游戏背景游戏实现角色类角色基类玩家类怪兽类游戏类游戏操作类客户端加上存档需要存档的数据存档定义备忘录模式出场空接口私有嵌套存档类创建存档和从存档恢复存档管理器类...
    99+
    2024-04-02
  • PHP中的中介者模式是什么
    本篇内容介绍了“PHP中的中介者模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!上回说道,我们在外打工的经常会和一类人有很深的接触,...
    99+
    2023-06-20
  • PHP中状态模式指的是什么
    这篇文章主要介绍了PHP中状态模式指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。状态模式从字面上其实并不是很好理解。这里的状态是什么意思呢?保存状态?那不就是备忘录...
    99+
    2023-06-20
  • PHP中的建造者模式是什么
    这篇文章主要介绍“PHP中的建造者模式是什么”,在日常操作中,相信很多人在PHP中的建造者模式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP中的建造者模式是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-20
  • PHP中的责任链模式是什么
    本篇内容介绍了“PHP中的责任链模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!责任链模式,属于对象行为型的设计模式。Gof类图及解...
    99+
    2023-06-20
  • PHP中的观察者模式是什么
    这篇文章主要讲解了“PHP中的观察者模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的观察者模式是什么”吧!介绍现在有两派,有的人建议使用设计模式,有的人不建议使用设计模式!...
    99+
    2023-06-20
  • php 中FastCGI模式的作用是什么
    php 中FastCGI模式的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、说明是一种让交互程序与 Web 服务器通信的协议。FastCGI 是早期通用网关接...
    99+
    2023-06-15
  • php中cli模式的作用是什么
    在PHP中,CLI(Command Line Interface)模式是指通过命令行界面执行PHP脚本的模式。CLI模式有以下作用:...
    99+
    2024-03-01
    php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作