当前位置: 首页 > news >正文

25 行为型模式-备忘录模式

1 备忘录模式介绍在这里插入图片描述

备忘录模式(memento pattern)定义: 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态.

2 备忘录模式原理

在这里插入图片描述
在这里插入图片描述

3 备忘录模式实现

在这里插入图片描述

/*** 发起人角色**/
public class Originator {private String state = "原始对象";private String id;private String name;private String phone;public Originator() {}//创建备忘录对象public Memento createMemento(){return new Memento(id,name,phone);}//恢复对象public void restoreMemento(Memento m){this.state = m.getState();this.id = m.getId();this.name = m.getName();this.phone = m.getPhone();}@Overridepublic String toString() {return "Originator{" +"state='" + state + '\'' +", id='" + id + '\'' +", name='" + name + '\'' +", phone='" + phone + '\'' +'}';}public String getState() {return state;}public void setState(String state) {this.state = state;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}
}
/*** 备忘录角色* 访问权限为: 默认,在同包下可见(尽量保证只有发起者类可以访问备忘录类)**/
class Memento {private String state = "从备份对象恢复原始对象";private String id;private String name;private String phone;public Memento() {}public Memento(String id, String name, String phone) {this.id = id;this.name = name;this.phone = phone;}public String getState() {return state;}public void setState(String state) {this.state = state;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "Memento{" +"state='" + state + '\'' +", id='" + id + '\'' +", name='" + name + '\'' +", phone='" + phone + '\'' +'}';}
}
/*** 负责人类-获取和保存备忘录对象**/
public class Caretaker {private Memento memento;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}
}
public class Client {public static void main(String[] args) {//创建发起人对象Originator o1 = new Originator();o1.setId("1");o1.setName("spike");o1.setPhone("13522777722");System.out.println("========"+o1);//创建负责人对象Caretaker caretaker = new Caretaker();caretaker.setMemento(o1.createMemento());//修改o1.setName("update");System.out.println("========" + o1);//从负责人对象中获取备忘录对象,实现恢复操作o1.restoreMemento(caretaker.getMemento());System.out.println("========" + o1);}
}
4 备忘录模式应用实例

在这里插入图片描述

/*** 备份玩家的状态**/
class Memento {private int money;  //玩家获取的金币ArrayList fruits;  //玩家获取的水果public Memento(int money) {this.money = money;this.fruits = new ArrayList();}//获取当前玩家的金币public int getMoney(){return money;}//获取当前玩家的水果List getFruits(){return (List) fruits.clone();}//添加水果void addFruit(String fruit){fruits.add(fruit);}}

Player玩家类,只要玩家的金币还够,就会一直进行游戏,在该类中会设置一个createMemento方法,其作用是保存当前玩家状态.还会包含一个restore撤销方法,相当于复活操作.

/*** 玩家类**/
public class Player {private int money;  //金币private List<String> fruits = new ArrayList<>();  //玩家获得的水果private static String[] fruitsName ={   //表示水果种类的数组"苹果","葡萄","香蕉","橘子"};Random random = new Random();public Player(int money) {this.money = money;}//获取当前所有金币public int getMoney(){return money;}//获取一个水果public String getFruit(){String prefix = "";if(random.nextBoolean()){prefix = "好吃的";}//从数组中拿一个水果String f = fruitsName[random.nextInt(fruitsName.length)];return prefix + f;}//掷骰子方法public void yacht(){int dice = random.nextInt(6) + 1; //掷骰子if(dice == 1){money += 100;System.out.println("所持有的金币增加了...");}else if(dice == 2){money /= 2;System.out.println("所持有的金币减少一半");}else if(dice == 6){ //获取水果String fruit = getFruit();System.out.println("获取了水果: " + fruit);fruits.add(fruit);}else{//其他结果System.out.println("无效数字,继续投掷!");}}//拍摄快照public Memento createMemento(){Memento memento = new Memento(money);for (String fruit : fruits) {//判断: 只保存 '好吃的'水果if(fruit.startsWith("好吃的")){memento.addFruit(fruit);}}return memento;}//撤销方法public void restoreMemento(Memento memento){this.money = memento.getMoney();this.fruits = memento.getFruits();}@Overridepublic String toString() {return "Player{" +"money=" + money +", fruits=" + fruits +'}';}
}

测试: 由于引入了备忘录模式,可以保存某个时间点的玩家状态,这样就可以对玩家进行复活操作.

public class MainApp {public static void main(String[] args) throws InterruptedException {//创建玩家类,设置初始金币Player player = new Player(100);//创建备忘录对象Memento memento = player.createMemento();for (int i = 0; i < 100; i++) {//显示扔骰子的次数System.out.println("第" + i+"次投掷!");//显示当前玩家状态System.out.println("当前状态: " + player);//开启游戏player.yacht();System.out.println("玩家所持有的金币: " + player.getMoney() + " 元");//复活操作if(player.getMoney() > memento.getMoney()){System.out.println("赚到金币,保存当前状态,继续游戏!");memento = player.createMemento();  //更新快照}else if(player.getMoney() < memento.getMoney() / 2){System.out.println("所持金币不多,将游戏恢复到初始状态!");player.restoreMemento(memento);}Thread.sleep(1000);}}
}
5 备忘录模式总结

在这里插入图片描述

相关文章:

25 行为型模式-备忘录模式

1 备忘录模式介绍 备忘录模式(memento pattern)定义: 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态. 2 备忘录模式原理 3 备忘录模式实现 /*** 发起人角色**/ public class Originator {private Strin…...

物联网AI MicroPython传感器学习 之 SHT3X温湿度传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 Sensirion SHT3x-DIS湿度和温度传感器基于CMOSens传感器芯片&#xff0c;更加智能、可靠&#xff0c;精度更高。SHT3x-DIS具有增强的信号处理能力、两个独特的用户可选I2C地址&#xff0c;通信…...

int* p = new int[5]; int *p = new int[5]();delete[] p; delete p;区别是什么?

int main() {int *p new int[5]; // 分配包含5个整数的数组内存// 初始化数组元素for (int i 0; i < 5; i) {p[i] i * 10;}// 试图使用 delete p; 来释放数组内存delete p;delete[] p;// 打印数组元素for (int i 0; i < 5; i) {std::cout << "p[" &l…...

数据结构|基础知识定义

1.值传递、地址传递、值返回、地址返回 1> 值传递&#xff1a;普通变量作为函数参数传递是单向的值传递&#xff0c;只是将实参的值复制一份给形参变量&#xff0c;形参的改变不会影响实参的值&#xff0c;因为所在内存空间不同 如果传递的是地址&#xff0c;被调函数使用指…...

物联网AI MicroPython传感器学习 之 MFRC522 RFID射频IC卡感应模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 MFRC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片&#xff0c;其特点低电压、低成本、体积小的非接触式读写芯片。MFRC522支持MIFARE系列更高速的非接触式通信&#xff0c;双向数据…...

搭建ES集群

目录 前言 搭建ES集群 集群状态监控 分片备份 节点角色 脑裂问题 分布式存储 分布式查询 故障转移 前言 单机的ES做数据存储必然会面临两个问题&#xff1a;海量数据存储问题、单机故障问题 海量数据存储问题&#xff1a;将索引库从逻辑上拆分为N个分片(shard)&…...

Tomcat的日志接收文件catalina.out nohup.out说明

catalina.out用于接收如下情况的日志&#xff1a; catalina.out其实是tomcat的标准输出(stdout)和标准出错(stderr)&#xff0c;这是在tomcat的启动脚本里指定的&#xff0c;如果没有修改的话stdout和stderr会重定向到这里。所以我们在应用里使用System.out打印的东西都会到这…...

手机ip地址切换后有什么影响

随着互联网的普及和人们对网络连接的需求不断增加&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。而在使用手机的过程中&#xff0c;手机ip地址的切换也成为了许多用户需要注意的问题。虎观代理小二二将探讨手机ip地址切换后可能产生的影响。 手机ip地址的含义及作…...

C++ 赋值运算重载,const成员,取地址及const取地址操作符重载

C 赋值运算重载&#xff0c;const成员&#xff0c;取地址及const取地址操作符重载 1. 赋值运算符重载1.1 运算符重载1.2 赋值运算符重载1.3 前置/--和后置/--重载 2. const成员3. 取地址及const取地址操作符重载 所属专栏&#xff1a;C“嘎嘎" 系统学习❤️ &#x1f680;…...

嵌入式Linux系统的闪存设备和文件系统学习纪要

嵌入式Linux系统的闪存设备和文件系统学习纪要 Linux下的文件系统结构如下&#xff1a; NAND Flash 是一种非易失性存储器&#xff08;Non-Volatile Memory&#xff09;&#xff0c;常用于闪存设备和固态硬盘&#xff08;SSD&#xff09;中。以下是几种常见的 NAND Flash 种类&…...

android 8.1 disable unsupported sensor

如果device不支持某种sensor,可以在android/frameworks/base/core/java/android/hardware/SystemSensorManager.java里将其disabled掉。以disable proximity sensor为例。 public SystemSensorManager(Context context, Looper mainLooper) {synchronized(sLock) {if (!sNativ…...

二、类与对象(一)

1 面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。以洗衣服为例&#xff0c;通常洗衣服会经历以下过程&#xff1a; 而C是基于面向对象的&#xff0c;关注的是对象&#xff0c…...

写给所有的程序员,或者努力生活的你。

朋友们&#xff0c;好好休息&#xff0c;意味着好好锻炼&#xff0c;好好睡觉&#xff0c;好好学习&#xff0c;学习可以是功利的&#xff0c;需要有规划的&#xff0c;有执行能力&#xff0c;有反馈奖励机制的&#xff0c;也可以无用之用方为大用&#xff08;比如take shit的时…...

pytorch 笔记:GRU

1 介绍 对于输入序列中的每个元素&#xff0c;每一层都计算以下函数&#xff1a; ht​ 是t时刻 的隐藏状态xt​ 是t时刻 的输入ht−1​ 是 t-1时刻 同层的隐藏状态或 0时刻 的初始隐藏状态rt​,zt​,nt​ 分别是重置门、更新门和新门。σ 是 sigmoid 函数∗ 是 Hadamard 乘积。…...

Kubernetes - Ingress HTTP 升级 HTTPS 配置解决方案(新版本v1.21+)

之前我们讲解过 Kubernetes - Ingress HTTP 搭建解决方案&#xff0c;并分别提供了旧版本和新版本。如果连 HTTP 都没搞明白的可以先去过一下这两篇 Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客Kubernetes - Ingress HTTP 负载搭建部署解决方案…...

Verilog:写流水灯时遇到的问题

module flow_led(input sys_clk, //系统时钟50Mhz 周期0.02nsinput sys_rst_n, //系统异步复位&#xff0c;低电平有效output reg [3:0] led ); reg [24:0] cnt;//计数器计时0.5s250000000*0.02ns always(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)cnt <…...

操作系统第四章-存储器管理

4.1 内存的基本知识 4.1.1 逻辑地址和物理地址 逻辑地址又称为相对地址 物理地址又称为绝对地址 一. 逻辑地址 内存中有多个进程,相对地址是相对于进程的起始地址而言的地址. 二.物理地址 绝对地址是在整个内存下的地址 4.2 程序的装入和链接 引入:用户程序要在系统中运…...

org.springframework.cloud:spring-cloud-starter-openfeign:jar is missing详解

openfeign无法导入的问题 我感觉最近带的好几个新人在搭建springCloud基础框架的时候&#xff0c;会犯一个非常小的错误&#xff0c;导致进度卡住了。 这个错误就是Feign导入的错误&#xff1a; ‘dependencies.dependency.version’ for org.springframework.cloud:spring-c…...

Netty第一部

一、select和epoll原理分析 外设设备网卡、鼠标、键盘等通过总线写到内存中&#xff0c;中间就有DMA拷贝&#xff0c;操作系统怎么知道内存中有数据了&#xff0c;这就需要操作系统通过中断机制确定&#xff0c;如果有中断信号过来&#xff0c;cpu会首先打断用户程序执行&…...

【设计模式】第11节:结构型模式之“装饰器模式”

一、简介 装饰器模式主要解决继承关系过于复杂的问题&#xff0c;通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外&#xff0c;装饰器模式还有一个特点&#xff0c;那就是可以对原始类嵌套使用多个装饰器。…...

收藏备用|2026版35岁程序员转行大模型完整路线,稳妥突破职业瓶颈

步入35岁职业关键期&#xff0c;不少资深程序员都面临发展瓶颈&#xff0c;当下势头迅猛的大模型行业&#xff0c;已然成为打破职业困局的优质新方向。和应届新人零基础摸索不同&#xff0c;在职程序员手握成熟编程功底与项目阅历&#xff0c;具备快速跨界入局的先天优势。本篇…...

别再死记硬背了!用UE5动画蓝图状态机做个“开关门”交互,5分钟搞懂运行流

用UE5动画蓝图状态机实现智能门交互&#xff1a;从理论到实战第一次接触虚幻引擎的动画系统时&#xff0c;那些抽象的概念总让人望而生畏。记得我刚开始学习UE4时&#xff0c;光是理解"状态机"这个概念就花了整整一周时间——直到我亲手实现了一个会自动开关的门。这…...

Python安装文档

下载安装包 访问官方网站:https://www.python.org/ 注意:本人开发使用的事3.13.x。 查看自己的系统 安装 进入安装界面,记得勾选最后一项:"Add python.exe to PATH",然后选择自定义安装 "Customize installation"。 然后进入特性选择页面,什么都…...

解锁iOS设备无限可能:2026最新越狱技术深度解析与实战指南

解锁iOS设备无限可能&#xff1a;2026最新越狱技术深度解析与实战指南 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder &#x1f447; 项目地…...

字节校招7000人转正率50%:大厂HR体系,正在“去经验化“

字节跳动刚刚用一组校招数据,扯下了大厂老兵最后一块遮羞布。 2026年春,ByteIntern规模狂飙至7000人,转正率史无前例地超过50%。 短短3到6个月,字节用远低于市场价的成本,批量生产出了3500个能够直接上岗的替代者。 同样的薪酬包,大厂宁愿招两个高潜应届生,也不愿意留…...

Google I/O 2026 | 开发者主题演讲精华集锦

作者 / Google I/O 团队AI 已不再只是提供辅助&#xff0c;而是迈向了能够在整个工作流中独立处理复杂任务的智能体阶段。在今年的 I/O 大会上&#xff0c;我们发布了 Gemini 3.5 系列模型&#xff0c;并升级了我们的 "智能体优先" 式开发平台 Antigravity&#xff0…...

RTX51多任务环境下printf安全调用方案解析

1. RTX51多任务环境下printf的安全调用方案在RTX51实时操作系统中&#xff0c;多个任务同时调用标准库函数printf时会出现"多重调用警告"(Warning 15: MULTIPLE CALL TO SEGMENT)。这个看似简单的调试输出问题&#xff0c;实际上涉及RTOS任务调度、函数重入、内存管理…...

不变量理论:从数学原理到机器学习中的对称性特征工程

1. 项目概述&#xff1a;从“区分”到“表达”的核心思想在数据科学和机器学习的世界里&#xff0c;我们常常面对一个根本性的挑战&#xff1a;如何从一堆看似杂乱无章、经过各种变换&#xff08;如旋转、平移、对称操作&#xff09;的数据中&#xff0c;提取出真正有意义的、稳…...

gmapping算法源码实现分析(一)

gmapping算法源码实现分析&#xff08;一&#xff09; —— slam-gmapping功能包主干流程分析 1. slam_gmapping.cpp 初始化流程: SlamGmapping() 构造函数├─> init() - 创建 GridSlamProcessor 实例&#xff0c;读取参数└─> startLiveSlam() - 设置订阅和回调├─&g…...

合肥Geo搜索优化服务的真实成本与效果分析

这两年&#xff0c;“AI搜索优化”、“GEO&#xff08;生成式引擎优化&#xff09;”在中小企业的朋友圈里反复刷屏。我身边不少安徽本土的老板&#xff0c;尤其是做教培、法律和机械制造的&#xff0c;从去年底就开始频繁问我&#xff1a;“这玩意儿到底靠不靠谱&#xff1f;投…...