设计模式之备忘录模式

news/2024/10/20 1:24:31/

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

该模式允许生成对象状态的快照和将其还原,主要用于撤销与重做功能的实现。

该模式存在3类角色:

  1. Originator原始对象:创建和恢复备忘录
  2. Memento备忘录对象
  3. Caretaker负责人:保存备忘录
Originator
- state
+backup()
+restore(m:Memento)
Memento
- state
+Memento(state)
+getState()
Caretaker
- history:Memento[]
+undo()
+redo()

代码实现:

//数据对象  
@AllArgsConstructor  
@Data  
@ToString  
@NoArgsConstructor  
public class Text {  private String title;  private String content;  
}
//Originator原始对象  
public class Editor {  private Text text;  private History history;  public Editor() {  this.history = new History();  }  public Text getText() {  return text;  }  // 撤销  public void undo() {  history.undo();  }  // 重做  public void redo() {  history.redo();  }  // 恢复  public void restore(String data) {  text = JSON.parseObject(data, Text.class);  }  //备份  public String backup() {  return JSON.toJSONString(text);  }  public void doAction(String title, String content) {  text = new Text(title, content);  history.add(new Memento(this));  }  
}
//Caretaker负责人  
public class History {  List<Memento> mementos = new ArrayList<>();  private int curIndex;  public void add(Memento memento) {  if (curIndex + 1 != mementos.size()) {  mementos = mementos.subList(0, curIndex);  }  mementos.add(memento);  curIndex = mementos.size() - 1;  }  // 撤销  public void undo() {  curIndex = Math.max(0, curIndex - 1);  Memento memento = mementos.get(curIndex);  memento.restore();  }  // 重做  public void redo() {  curIndex = Math.min(mementos.size(), curIndex + 1);  Memento memento = mementos.get(curIndex);  memento.restore();  }  
}
// 备忘录对象  
@Data  
public class Memento {  //值对象,存储数据  private String state;  private Editor editor;  public Memento(Editor editor) {  this.editor = editor;  // 备份  state=this.editor.backup();  }  public void restore(){  editor.restore(state);  }  
}
Editor editor=new Editor();  
editor.doAction("1","1");  
editor.doAction("2","2");  
editor.undo();  
System.out.println(editor.getText());  
editor.redo();  
System.out.println(editor.getText());
// 结果是:
//Text(title=1, content=1)
//Text(title=2, content=2)

备忘录模式的优点是能在不破坏封装性的前提下创建对象的快照。


http://www.ppmy.cn/news/96637.html

相关文章

目标检测YOLO实战应用案例100讲-基于深度学习的无人机航拍图像目标检测算法研究与应用

基于深度学习的无人机航拍图像目标检测算法研究与应用 无人机是无线遥控装置和内置的程序控制装置操纵,亦或由车载计算机完全地 或间歇地规律操控的不载人飞机。无人机的地面航拍成像在军事探察、地质勘探、 公安侦查等领域[1-2]得到广泛应用。在军事领域,能够通过无人机进行…

启动U盘制作工具Rufus 4.0.2035

Rufus是是一款小巧实用免费开源的帮助格式化和创建可启动USB闪存驱动器的工具&#xff0c;如USB钥匙/软盘、记忆棒等&#xff0c;可快速制作linux系统或者win启动u盘&#xff0c;可快速的将ISO镜像文件制作成可引导启动的USB启动盘&#xff0c;支持ISO镜像、GPT和UEFI&#xff…

第五十五天学习记录:C语言进阶:动态内存管理Ⅲ

柔性数组 C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员。 柔性数组的特点&#xff1a; 。结构体中的柔性数组成员前面必须至少有一个其他成员。 。sizeof返回的这种结构大小不包括柔性数组的内存。 。包含柔性数组成员的结构…

海量数据中找出前k大数(topk问题),一篇文章教会你

&#x1f4af; 博客内容&#xff1a;【数据结构】向上调整建堆和向下调整建堆的天壤之别以及堆排序算法 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&…

HNU-电路与电子学-综合设计-模型机

写在前面&#xff1a; 每一年的综合设计肯定都有改动&#xff0c;故肯定不能照搬照抄&#xff0c;大家可以借鉴思路&#xff0c;复现成果&#xff0c;但要注意不同之处&#xff0c;以免被0分处理。 模型设计的指导书我不放在这里了&#xff0c;因为那是课程组老师们的成果。 …

Ping过程 原理 详解

Ping过程 原理 详解 ***\*3:\**表示RARP请求** ***\*4:\**表示RARP应答** 再继续… 如果主机A要ping主机C,那么主机A发现主机C的IP和自己不是同一网段,他就去找 ***\*网关\**** 转发,但是他也不知道网关的MAC情况下呢?他就会向之前那个步骤一样 **先发送一个 ARP广播…

SAP-MM费用类采购通过物料组确定科目

一、WRX的配置&#xff0c;分两类GR/IR科目&#xff1a; 1、做库存管理物料的GR/IR科目&#xff0c;需要配置评估类&#xff0c;此评估类就是物料主数据里配置的评估类&#xff1b; 2、非库存管理费用化物料的GR/IR科目&#xff0c;如固定资产、办公用品、低值易耗品等等&#…

堆(堆排序 模拟堆)

目录 一、堆的数据结构二、堆的操作方法往下调整的示意图往上调整的示意图相关功能的实现思路1.插入一个数2.求最小值3.删除最小值4.删除任意一个元素5.修改任意一个元素 三、堆的实战运用堆排序模拟堆 一、堆的数据结构 堆是一个完全二叉树&#xff1a;除了最后一层结点以外&…