浅谈PHP设计模式的备忘录模式

简介:

备忘录模式,属于行为型的设计模式。
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
备忘录模式顾名思义,就是存档功能,类似Git工具,每次提交都相当于一次备份。
主要有一下角色构成
Memento —— 负责存储 Originator 的 唯一内部状态 ,它可以包含: string,number, array,类的实例等等。Memento 「不是公开的类」(任何人都不应该且不能更改它),并防止 Originator 以外的对象访问它,它提供 2 个接口:Caretaker 只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator 却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
Originator —— 它负责创建 Memento ,并记录 外部对象当前时刻的状态, 并可使用 Memento 恢复内部状态。Originator 可根据需要决定 Memento 存储 Originator 的哪些内部状态。 Originator 也许(不是应该)有自己的方法(methods)。 但是,他们 不能更改已保存对象的当前状态。
Caretaker —— 负责保存 Memento。 它可以修改一个对象;决定 Originator 中对象当前时刻的状态; 从 Originator 获取对象的当前状态; 或者回滚 Originator 中对象的状态。

适用场景:

任何撤销操作的后悔药,前提是有备份。

优点:

任何撤销操作的后悔药,前提是有备份。

缺点:

存档的过程会带来性能问题。

代码:

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

//备忘录,非常简单,就是用于记录状态。将这个状态以对象的形式保存,就可以让原发器非常方便地创建很多存档用于记录各种不同的状态。
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();

原文链接:https://www.cnblogs.com/phpphp/p/16880837.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈PHP设计模式的备忘录模式 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • PHP ajax 异步执行不等待执行结果的处理方法

    让我来给你详细讲解 “PHP ajax 异步执行不等待执行结果的处理方法”的完整攻略。 什么是PHP ajax异步执行? 首先,我们来介绍一下什么是PHP ajax异步执行。在传统的应用程序中,需要等待程序执行结束后才能进行下一步操作,这就造成了用户界面的卡顿,用户体验较差。而ajax就是一种无需刷新整个页面的技术,能够后台异步执行请求,并且不会影响整个页面…

    PHP 2023年5月27日
    00
  • PHP生成zip压缩包的常用方法示例

    下面是详细讲解 “PHP生成zip压缩包的常用方法示例” 的完整攻略: 概述 Zip压缩包是一种常见的文件压缩格式,可以将多个文件或文件夹压缩成一个文件,方便文件的传输和存储。在PHP中,我们可以使用ZipArchive类来生成和操作Zip压缩包。 安装ZipArchive扩展 在PHP 5.2以上版本中,ZipArchive已经作为一个扩展模块包含在其中了…

    PHP 2023年5月26日
    00
  • PHP实现采集程序原理和简单示例代码

    下面详细讲解一下“PHP实现采集程序原理和简单示例代码”的完整攻略。 什么是采集程序? 采集程序指的是从互联网上获取特定信息的程序。这些信息可以是图片、文字、视频等等,采集程序可以自动化地从指定的网站或页面抓取这些信息,然后按照指定的方式对其进行存储或处理。 采集程序有很多应用场景,如爬虫、数据分析、SEO优化等等。 PHP实现采集程序的原理 PHP实现采集…

    PHP 2023年5月23日
    00
  • 为Nginx和Apache配置多版本PHP、切割多个conf文件

    有时候我们的项目不可能都是同一个PHP版本,需要每个项目都配置不同版本的PHP,宝塔和PHPStudy就是通过以下配置实现的: Nginx 切割conf(非选) 在nginx.conf添加 include vhosts/*.conf; 这样Nginx会自动引入当前目录->vhosts目录下的所有*.conf文件,方便每个项目单独管理Nginx配置文件 …

    PHP 2023年4月18日
    00
  • 学编程选什么语言好?是PHP、Python还是Ruby?

    学编程选什么语言好?是PHP、Python还是Ruby? 如今,学习编程已经成为一项非常流行的技能。在学习编程之前,选择一门编程语言是非常重要的。本文将会提供一个完整攻略,帮助读者选择合适的编程语言。 基础知识 首先,需要了解的是,每一门编程语言都有其自身的特点和应用场景。下面是三门流行的编程语言的特点: PHP PHP是一门被设计用来为Web应用程序开发的…

    PHP 2023年5月26日
    00
  • PHPThumb PHP 图片缩略图库

    PHPThumb 是一个开源的 PHP 图片缩略图库,它能够动态生成缩略图,并且还支持水印、旋转、裁剪等功能。下面是 PHPThumb 的使用攻略。 安装 PHPThumb 是一个 PHP 库,可以通过 Composer 进行安装。在项目根目录下运行下面的命令即可: composer require masterexploder/phpthumb 基本用法 …

    PHP 2023年5月27日
    00
  • 这是我的战争数学老头消除沮丧情绪的妙用介绍

    使用“战争数学”帮助老年人消除沮丧情绪 随着年龄的增长,老年人常常会感到孤独、无聊或者沮丧,这时候让他们体验一些有意思的游戏可以缓解这些情绪。今天我向大家介绍使用“战争数学”帮助老年人消除沮丧情绪的方法。 什么是战争数学 战争数学 (Arithmetic War) 是一款简单、有趣、易于上手的数学游戏,是一种独立开发的开源计算机软件。玩家需要在规定的时间内尽…

    PHP 2023年5月26日
    00
  • mysql中mydumper 和 mysqldump 对比使用

    当需要备份MySQL数据库时,MySQL提供了mydumper和mysqldump两个备份工具,它们都是MySQL数据库备份工具,但是使用方式和备份结果有所不同。下面是mysql中mydumper 和 mysqldump的详细对比使用攻略。 一、mysqldump 1.1 用法 mysqldump 是MySQL官方提供的备份工具。使用 mysqldump 命…

    PHP 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部