备忘录模式的学习与使用

news/2024/11/23 9:09:48/

1、备忘录模式的学习

  当您需要在不破坏封装性的前提下保存和恢复对象的状态时,备忘录模式是一种有用的设计模式。备忘录模式允许您将对象的状态保存到备忘录对象中,并在需要时从备忘录中恢复状态。这种模式分离了状态的保存和恢复逻辑,使得对象的状态管理更加灵活和可扩展
  备忘录模式包含以下几个关键角色:

  • Originator(原发器):原发器是要保存和恢复状态的对象。它可以创建备忘录对象来保存其内部状态,并从备忘录对象中恢复状态。
  • Memento(备忘录):备忘录通常具有与原发器相对应的属性,并可以通过原发器访问其内部状态。
  • Caretaker(负责人):负责人对象负责保存和管理备忘录对象。它可以将备忘录传递给原发器以进行状态的恢复,或者将备忘录存档以供以后使用。

  备忘录模式的工作流程如下:

  1. 原发器创建一个备忘录对象,并将自己的状态存储在备忘录中。
  2. 原发器可以使用备忘录对象来保存其内部状态。
  3. 在需要时,原发器可以从备忘录中恢复其状态。
  4. 负责人对象可以保存多个备忘录对象,并负责管理它们的存储和恢复。
    在这里插入图片描述

2、备忘录模式的使用

  假设你正在开发一个文本编辑器应用程序。你需要实现一个撤销(undo)功能,使用户能够撤销对文本的修改操作。你可以使用备忘录模式来实现这个功能。
备忘录

public class TextMemento {private String value;public TextMemento(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}

原发器

public class TextOriginator {private TextMemento textMemento;public void setTextMemento(String value) {if (Objects.isNull(textMemento)) {this.textMemento = new TextMemento(value);} else {this.textMemento.setValue(value);}}public void restoreTextMemento(TextMemento textMemento) {this.textMemento.setValue(textMemento.getValue());}public TextMemento createTextMemento() {return new TextMemento(this.textMemento.getValue());}public TextMemento getTextMento() {return textMemento;}
}

负责人

public class TextCaretaker {private List<TextMemento> textMementoList = new ArrayList<>();public Integer addTextMemento(TextMemento textMemento) {textMementoList.add(textMemento);return textMementoList.size();}public TextMemento getTextMento(int index) {if (index < textMementoList.size()) {return textMementoList.get(index);}return null;}
}

客户端

public class TextMementoClient {public static void main(String[] args) {TextCaretaker textCaretaker = new TextCaretaker();TextOriginator textOriginator = new TextOriginator();textOriginator.setTextMemento("状态1");textCaretaker.addTextMemento(textOriginator.createTextMemento());textOriginator.setTextMemento("状态2");textCaretaker.addTextMemento(textOriginator.createTextMemento());textOriginator.setTextMemento("状态3");textCaretaker.addTextMemento(textOriginator.createTextMemento());System.out.println(textOriginator.getTextMento().getValue());textOriginator.restoreTextMemento(textCaretaker.getTextMento(0));System.out.println(textOriginator.getTextMento().getValue());}
}
状态3
状态1

3、总结

备忘录模式的优点包括:

  • 它可以保存和恢复对象的状态,而无需破坏其封装性。
  • 它可以简化原发器的代码,将状态管理交给负责人对象。
  • 它提供了灵活性,使得可以随时保存和恢复对象的不同状态。

然而,备忘录模式也有一些注意事项:

  • 备忘录对象可能会消耗较大的内存,特别是在保存大量状态时。
  • 备忘录对象通常只由原发器访问,因此其他对象无法直接访问或修改备忘录中的状态。

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

相关文章

实现一个周选择器组件

1、需求&#xff1a; 默认每个月的第一个周一为该月的第一周开始&#xff0c;规则如图所示 2、使用到的工具&#xff1a; vue2vant2momentjs 3、父组件&#xff1a; data中定义涉及到的参数 minDate: new Date(this.$moment().subtract(12,month)) maxDate: new Date(),…

设计师都在找的在线SVG编辑工具!赶快收藏

为了方便设计师编辑和修改SVG图形&#xff0c;本文将介绍5款易于使用的在线SVG编辑工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一款强大的在线SVG编辑工具&#xff0c;它可以支持路径编辑、形状编辑、填充和边框编辑、文本编辑等多种编辑需求&#xff…

linux测硬盘读写速度、内存读写速度

测硬盘的读写速度可以用以下命令&#xff1a;dd if/dev/zero offile bs1M count1024 测内存读写速度可以使用以下命令&#xff1a; dd if/dev/zero of/dev/null bs1M count1024

windows 检测硬盘读写速度

使用管理员权限打开 命令行窗口 winsat disk (检测c盘读写速度) winsat disk -drive e (检测e盘读写速度) 欢迎光临我的淘宝店&#xff1a; https://shop113189537.taobao.com/?spma211vu.server-web-home.sellercard.15.64f02d58fKtmoz

Linux查看硬盘读写性能

Linux查看硬盘读写性能&#xff1a;iostat -d -k -x 1 10 Linux 3.10.0-957.el7.x86_64 (hj-node-2) 09/09/2022 _x86_64_ (8 CPU)Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda …

linux测试sata硬盘读写速度

首先内核中要编译进去sata驱动&#xff0c;make menuconfig中将sata驱动选上&#xff0c;编译内核&#xff0c;在开发板上启动&#xff0c;然后fdisk -l查看磁盘分区&#xff0c;挂载上sata硬盘。 第一种方法&#xff0c;利用dd命令。 测试硬盘的读取速度&#xff1a; time dd …

用windows自带工具进行硬盘读写速度检测

我的磁盘是L盘。 以管理员身份启动cmd winsat disk -drive h会生成tmp文件

【杂事随写】 记一次移动硬盘写入速度骤降

好吧&#xff0c; 这是一次纯文本的分享。 某次&#xff0c; 同事想要我要录制的培训视频&#xff0c; 60个G那么大。 我让他拿U盘来&#xff0c; 小意思嘛是不是。 插上&#xff0c; 写入30M/s&#xff0c; 直接跟他说&#xff0c; 你这U盘不行&#xff0c; 看我的。 拿上拆…