PHP备忘录模式(Memento Pattern)

PHP备忘录模式(Memento Pattern)

备忘录模式是一种行为设计模式,它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。在备忘录模式中,可以随时保存对象的状态,以便在以后的某个时间点恢复它。这个模式非常适合需要撤销操作的场景。

模式结构

备忘录模式包含三个角色:

  • 发起人(Originator):它是需要被保存状态的对象。
  • 备忘录(Memento):它是存储发起人对象内部状态的对象。
  • 管理者(Caretaker):它负责存储备忘录对象,并提供给发起人对象恢复其状态的接口。 转存失败重新上传取消

实现步骤

以下是实现备忘录模式的步骤:

  1. 定义发起人类(Originator),并在其中定义一些状态。
  2. 定义备忘录类(Memento),并在其中定义一些需要保存的状态。
  3. 定义管理者类(Caretaker),并在其中定义一些备忘录对象的操作方法。
  4. 在发起人类中定义创建备忘录对象的方法,并将其传递给管理者类进行存储。
  5. 在发起人类中定义从备忘录对象中恢复状态的方法。

代码示例

以下是一个简单的 PHP 实现备忘录模式的示例:

<?php
// 发起人类
class Originator {
    private $state;
    public function setState($state) {
        $this->state = $state;
    }
    public function getState() {
        return $this->state;
    }
    public function createMemento() {
        return new Memento($this->state);
    }
    public function restoreMemento(Memento $memento) {
        $this->state = $memento->getState();
    }
}
// 备忘录类
class Memento {
    private $state;
    public function __construct($state) {
        $this->state = $state;
    }
    public function getState() {
        return $this->state;
    }
}
// 管理者类
class Caretaker {
    private $mementos = [];
    public function addMemento(Memento $memento) {
        $this->mementos[] = $memento;
    }
    public function getMemento($index) {
        return $this->mementos[$index];
    }
}
// 使用备忘录模式
$originator = new Originator();
$caretaker = new Caretaker();
$originator->setState("State 1");
$caretaker->addMemento($originator->createMemento());
$originator->setState("State 2");
$caretaker->addMemento($originator->createMemento());
$originator->setState("State 3");
$caretaker->addMemento($originator->createMemento());
$originator->restoreMemento($caretaker->getMemento(1));
echo $originator->getState(); // 输出:State 2

在上面的示例中,我们定义了一个 Originator 类来保存状态,一个 Memento 类来存储状态,一个 Caretaker 类来管理备忘录对象。我们创建一个 Originator 对象,并使用 Caretaker 对象来存储其状态,然后使用 Originator 对象来恢复状态。

适用场景

备忘录模式适用于以下场景:

  • 当需要保存对象状态的快照并在以后的某个时间点恢复时。
  • 当直接访问对象的状态会破坏其封装性时。
  • 当需要提供撤销操作时。

优点和缺点

备忘录模式的优点包括:

  • 它提供了一种非破坏性的状态恢复方法。
  • 它可以很容易地扩展以支持多个保存点。
  • 它可以让您实现撤销操作。 备忘录模式的缺点包括:
  • 它可能会导致内存占用过高,特别是在保存大量状态时。
  • 每次保存状态时,需要创建一个备忘录对象,这可能会导致性能问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/9751.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hive小文件问题

1、小文件产生的原因 数据源本身有很多小文件&#xff1a;reduce数量多导致生成的小文件增多&#xff1a;使用动态分区导致小文件增多&#xff1a; 2、小文件危害 HDFS内存资源消耗过大&#xff0c;并限制了数据存储规模&#xff1a;在HDFS中&#xff0c;具体的文件保存在da…

静态链表常用操作(节点计数/查找/增加/删除)

1.封装计算链表节点个数的API 代码心得&#xff1a; cnt是count的缩写&#xff0c;用来计数。节点&#xff0c;我们一般指的是链表中数据的地址&#xff08;指针&#xff09;。比如节点1就是第一个结构体的地址&#xff0c;节点2就是第2个结构体的地址&#xff0c;以此类推。…

Adaptive AUTOSAR架构和特性介绍

概述 本文主要内容分为两章节。第一章节简要介绍了AUTOSAR的软件架构,设计理念以及方法论,对Classic Platform和Adaptive Platform做了简单的比较。第二章主要介绍了Adaptive Platform的特性。 第一章 AUTOSAR架构介绍 AUTOSAR(AUTomotive Open System ARchitecture)是汽车…

MySQL性能优化(四)性能优化总结

文章目录连接优化服务端链接优化客户端连接优化配置的优化架构优化数据库高可用&#xff1a;数据库慢查询慢查询日志profiling工具表结构和存储引擎的优化存储引擎&#xff1a;表结构SQL与索引的优化案例- 执行计划 ExplainID序号select type查询类型type 针对单表的访问方法Sy…

ChatGPT 与 MindShow 一分钟搞定一个PPT

前言 PPT制作是商务、教育和各种场合演讲的重要组成部分。然而&#xff0c;很多人会花费大量时间和精力在内容生成和视觉设计方面。为了解决这个问题&#xff0c;我们可以利用两个强大的工具——ChatGPT和MindShow&#xff0c;来提高制作PPT的效率。 一、ChatGPT 与 MindShow…

Linux操作系统ARM体系结构处理器机制原理与实现

ARM 的概念ARM(Advanced RISC Machine)&#xff0c;既可以认为是一个公司的名字&#xff0c;也可以认为是对一类微处理器的通称&#xff0c;还可以认为是一种技术的名字。ARM 公司并不生产芯片也不销售芯片&#xff0c;它只出售芯片技术授权。其合作公司针对不同需求搭配各类硬…

ChatGPT惨遭围剿?多国封杀、近万人联名抵制……

最近&#xff0c;全世界燃起一股围剿ChatGPT的势头。由马斯克、图灵奖得主Bengio等千人联名的“暂停高级AI研发”的公开信&#xff0c;目前签名数量已上升至9000多人。除了业内大佬&#xff0c;欧盟各国和白宫也纷纷出手。 最早“动手”的是意大利&#xff0c;直接在全国上下封…

SwinTransformer学习

参考&#xff1a; Swin-Transformer网络结构详解 https://blog.csdn.net/qq_37541097/article/details/121119988 x.1 前言 x.1.1 特点 它具有两个特点&#xff1a; 采用类似卷积神经网络中的层次构建方法采用W-MSA和SW-MSA全新的位置编码方式 层次构建方法 相比较于ViT&…

从零开始学Python第12课:常用数据结构之集合

在学习了列表和元组之后&#xff0c;我们再来学习一种容器型的数据类型&#xff0c;它的名字叫集合&#xff08;set&#xff09;。说到集合这个词大家一定不会陌生&#xff0c;在数学课本上就有这个概念。如果我们把一定范围的、确定的、可以区别的事物当作一个整体来看待&…

有符号加法运算

实例 module Signed_add(input signed [3:0] a,input signed [3:0] b,output signed [4:0] out );wire signed [3:0] a1;wire [3:0] a2;wire signed [3:0] b1;wire [3:0] b2;wire signed [4:0] out1;wire [4:0] out2;wire signed [4:0] out3;wire …

五步教你如何注册一个公司网站

在今天的数字化时代&#xff0c;每个公司都需要一个强大的线上存在感。注册一个公司网站是实现这一目标的第一步。但是&#xff0c;对于许多公司而言&#xff0c;这个过程可能有些困难。因此&#xff0c;在本文中&#xff0c;我将介绍一个五步计划&#xff0c;让您轻松注册一个…

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?

SpringBoot源码下载地址&#xff1a;https://github.com/spring-projects/spring-boot/tags 文章目录&#x1f35f;下载源码&#x1f357;环境准备&#x1f356;注解解析&#x1f35d;SpringBootConfiguration注解&#x1f35b;EnableAutoConfiguration注解&#x1f364;AutoC…

AD20的PCB布线规则设定

目录 1、最小安全间距 2、线宽规则 3、过孔 4、盖油工艺设计 5、内电层焊盘模式设置 6、反焊盘间距设计 7、焊盘与覆铜连接类型 AD20的规则库设定是PCB布线的首要工作&#xff0c;在布线初期就要设置好&#xff0c;布线的过程中还需要动态的变更&#xff0c;因此本篇总结了PCB的…

【Linux】之nc命令(连接与扫描指定端口、监测服务端口的使用情况)解析、详解实例、邮件告警

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录nc命令简介nc命令的安装nc命令语法格式…

【K8S系列】Pod详解

目录 序言 1 前言 2 为什么需要pod 3 什么是Pod&#xff1f; 3.1 Pod的组成 3.2 Pod的用途 3.3 Pod的生命周期 3.4 Pod的特点 4 Pod的使用 5 结论 序言 任何一件事情&#xff0c;只要坚持六个月以上&#xff0c;你都可以看到质的飞跃。 今天学习一下K8s-Pod相关内容&…

SQL删除记录方式汇总

大家好&#xff0c;我是RecordLiu! 今天给大家分享的是SQL中删除记录的不同方式&#xff0c;我会用几道真题来给大家讲解。 题目直达链接&#xff1a; 牛客网在线SQL编程练习 切换到SQL篇就能看到了。 我这里先列下知识点&#xff1a; SQL中进行简单删除的语法是什么?SQL…

关于AI 绘画,我给你总结了一份详细的关键词(Prompt 知识)

写在前面 随着人工智能技术的不断发展&#xff0c;越来越多的应用场景被发掘。其中&#xff0c;AI绘画是一种新兴的领域&#xff0c;其应用范围涵盖了数字媒体、游戏设计、动画制作、艺术创作等多个领域。在本文中&#xff0c;我们将介绍AI绘画的基本概念、发展历程、技术原理…

最新JavaFx JDK17如何正确的打出可以使用的exe软件包

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、提前需要准备&#xff1f;二、打包步骤1.现将module-info.java删除 选中module-info.java 鼠标右键 Refactor 然后选择safe deleted2.编辑设置 路径 Run/edi…

教你安装各种应用环境-Nodejs

因为最近做项目用到了Nodejs&#xff0c;如果直接下那么用到的就是最新版本。我要用以前的版本这就让我产生了写这篇文章的想法。 安装官网 官网&#xff1a;https://nodejs.org/en 如果安装最新的直接下载安装就行&#xff0c;流程可以看后面。 流程 其他版本点击"O…

年薪30W+,待遇翻倍,我的经历值得每个测试人借鉴

从自考大专到出走公司&#xff0c;从半年无业露宿深圳北站&#xff0c;从8k…到11.5k…再到20k&#xff0c;我的经历值得每个测试人借鉴 或许学历并没有那么重要 12年高考之后&#xff0c;在朋友的介绍下&#xff08;骗了过去&#xff09;&#xff0c;没有好好的读大学&#x…