java设计模式(二二)备忘录模式(Memeton Pattern)

news/2024/8/22 21:32:22 标签: 设计模式, 备忘录模式

1、模式介绍:

备忘录模式是一种行为设计模式,它允许在不破坏封装的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

2、应用场景:

需要保存和恢复对象的历史状态,例如撤销操作。
需要提供一个可回滚的操作,如编辑器中的撤销/重做功能。
需要实现检查点(checkpoint)和复原的功能,如游戏中的存档功能。

3、优点:

提供了一种可以恢复对象状态的机制,使得用户可以比较方便地回滚到之前的状态。
实现了状态的封装,使得对象状态信息对其他对象不可见,符合了封装的原则。

4、缺点:

如果需要保存的对象状态非常多,可能会消耗大量的内存。
在频繁创建备忘录对象时,可能会产生较大的开销。

5、代码示例:

/**
 * 备忘录类,存储原始对象的状态
 */
public class Memento {
	 private String state;

	 public Memento(String stateToSave) {
 	 	state = stateToSave;
	 }

 	public String getSavedState() {
  		return state;
 	}
}

/**
 * 原始对象,可以创建备忘录和从备忘录中恢复状态
 */
public class Originator  {
	private String state;

	public void setState(String state) {
		this.state = state;
	}

	public String getState() {
		return state;
	}

	// 创建备忘录,保存当前状态
	public Memento saveStateToMemento() {
		return new Memento(state);
	}

	// 从备忘录中恢复状态
	public void restoreStateFromMemento(Memento memento) {
		state = memento.getSavedState();
	}
}


/**
 * 管理者类,负责保存和恢复备忘录
 */
public class Caretaker {
 	private Memento memento;

	public void setMemento(Memento memento) {
 	 	this.memento = memento;
	}

	public Memento getMemento() {
 	 	return memento;
 	}
}


/**
 * 应用
 */
public class MementoClient {
	public static void main(String[] args) {
		// 创建原始对象
		Originator originator = new Originator();
		originator.setState("State1");

		// 创建备忘录,并保存当前状态
		Memento memento = originator.saveStateToMemento();

		// 使用管理者类保存备忘录
		Caretaker caretaker = new Caretaker();
		caretaker.setMemento(memento);

		// 修改原始对象的状态
		originator.setState("State2");

		// 恢复原始对象的状态
		originator.restoreStateFromMemento(caretaker.getMemento());

		System.out.println("Current State: " + originator.getState());
	}
}

6、示例讲解:

Memento 类用于存储原始对象的状态。
Originator 类是拥有状态的原始对象,它能创建备忘录并从备忘录中恢复状态。
Caretaker 类负责保存和管理备忘录。
在 main 方法中,首先创建 Originator 对象,并设置其状态为 "State1"。然后创建备忘录并保存当前状态。接着修改原始对象的状态为 "State2"。最后,使用 Caretaker 恢复原始对象的状态,并打印出当前状态。


http://www.niftyadmin.cn/n/5556638.html

相关文章

HC05主从一体蓝牙模块的裸机使用——单片机<-->蓝牙模块

HC-05是一种常用的蓝牙模块,具有低功耗、低成本、易于使用的特点。它可以实现与其他蓝牙设备(如手机、电脑等)进行无线通信。HC-05蓝牙模块具有串口通信接口,可以通过串口与主控制器(如Arduino、Raspberry Pi等&#x…

【Linux】多线程_7

文章目录 九、多线程8. POSIX信号量根据信号量环形队列的生产者消费者模型代码结果演示 未完待续 九、多线程 8. POSIX信号量 POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。 创建…

jmeter-beanshell学习10-字符串补齐位数

每天都遇到新问题,今天又一个场景,一个字符串,如果不足11位,则左边补0,补够11位。 先要获取字符串长度,然后计算差多少位,补齐。今天又发现一个Object类型,这个类型有点厉害&#x…

设计模式-创建型模式之工厂方法模式

和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。 工厂方法模式的主要角色: 抽象工厂(AbstractFactory):提供了创建产品的接…

【Pytorch实战教程】对抗样本生成中是如何添加噪声的?

文章目录 对抗样本中添加随机生成的对抗噪声代码解析应用场景示例代码对抗样本中添加随机生成的对抗噪声 通常在对抗训练或者生成对抗样本时使用,目的是为了稍微扰动模型的输入数据,从而测试或增强模型在面对输入数据轻微变化时的鲁棒性。 x = x + torch.zeros_like(x).uni…

Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器

章节内容 上节我们完成了: ZNode的基本介绍ZNode节点类型的介绍事务ID的介绍ZNode实机测试效果 背景介绍 这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff…

Spark核心技术架构

Apache Spark是一个开源的分布式计算系统,它提供了一个快速、通用和易于使用的集群计算环境。Spark 支持多种编程语言,如 Scala、Java 和 Python,并针对大规模数据处理进行了优化。以下是 Spark 技术架构的详细简述: 1. 核心组件…

《云原生安全攻防》-- 容器攻击案例:Docker容器逃逸

当攻击者获得一个容器环境的shell权限时,攻击者往往会尝试进行容器逃逸,利用容器环境中的错误配置或是漏洞问题,从容器成功逃逸到宿主机,从而获取到更高的访问权限。 在本节课程中,我们将详细介绍一些常见的容器逃逸方…