Java设计模式-备忘录模式、备忘录模式应用场景是什么、又怎么使用

article/2025/11/10 19:00:02

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用!

6.11 备忘录模式

6.11.1 定义

又称快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存此状态,以便后续需要时将该对象恢复到原先保存的状态

6.11.2 结构

  • 发起人角色(originator):记录当前时刻的内部状态信息,提供创备忘录和恢复备忘录数据的功能,实现其他业务功能,可以访问备忘录里的所有信息
  • 备忘录角色(memento):负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人
  • 管理者角色(Caretaker):对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录内容进行访问与修改
  • 两个等效接口:
    • 窄接口:管理对象(和发起人对象之外的任何对象)看到的是备忘录的窄接口(narrow interface),此接口仅仅运行它把备忘录对象传给其他对象
    • 宽接口:发起人可以看到宽接口(wide interface),此接口运行它读取所有的数据,以便根据这些数据恢复这个发起人对象的内部状态

6.11.3 案例

6.11.3.1 白箱模式

  • 特点:对所有对象提供一个宽接口,违反了封闭原则
  • 游戏角色
public class GameRole {  
//    角色名称  private String name;  
//    生命力  private int vita;  
//    攻击力  private int attack;  
//    防御力  private int defender;  public int getVita() {  return vita;  }  public void setVita(int vita) {  this.vita = vita;  }  public int getAttack() {  return attack;  }  public void setAttack(int attack) {  this.attack = attack;  }  public int getDefender() {  return defender;  }  public void setDefender(int defender) {  this.defender = defender;  }  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  //    初始化状态  public void initState(){  this.attack = 100;  this.vita = 100;  this.defender = 100;  }  
//    战斗  public void fight(){  this.vita -= 50;  this.attack -= 50;  this.defender -= 50;  }  
//    保存状态  public RoleStateMemento saveState(){  return new RoleStateMemento(name,vita,attack,defender);  }  
//    恢复角色状态  public void recoverState(RoleStateMemento roleStateMemento){  
//        将备忘录对象中数据赋值给角色对象成员  this.vita = roleStateMemento.getVita();  this.attack = roleStateMemento.getAttack();  this.defender = roleStateMemento.getDefender();  }  
//    展示角色属性  public void display(){  System.out.println("角色" + name + "属性:");  System.out.println("角色生命力:" + this.vita);  System.out.println("角色攻击力:" + this.attack);  System.out.println("角色防御力:" + this.defender);  }  
}
  • 备忘录对象
public class RoleStateMemento {  //    角色名称  private String name;  //    生命力  private int vita;  //    攻击力  private int attack;  //    防御力  private int defender;  public int getVita() {  return vita;  }  public void setVita(int vita) {  this.vita = vita;  }  public int getAttack() {  return attack;  }  public void setAttack(int attack) {  this.attack = attack;  }  public int getDefender() {  return defender;  }  public void setDefender(int defender) {  this.defender = defender;  }  public String getName() {  return name;  }  public RoleStateMemento(String name, int vita, int attack, int defender) {  this.attack = attack;  this.vita = vita;  this.defender = defender;  this.name = name;  }  public RoleStateMemento() {  }  
}
  • 备忘录管理对象
public class RoleStateManage {  
//    用集合存储备忘录对象  private Map<String,RoleStateMemento> map = new HashMap<String,RoleStateMemento>();  
//    添加备忘录对象  public void addRoleStateMemento(RoleStateMemento roleStateMemento){  map.put(roleStateMemento.getName(),roleStateMemento);  }  
//    获取备忘录对象  public RoleStateMemento getRoleStateMemento(String name){  return map.get(name);  }  
}
  • 测试
    public static void main(String[] args) {  System.out.println("大战前-----------------------");  
//        创建角色  GameRole gameRole = new GameRole();  gameRole.setName("张三");  
//        初始化  gameRole.initState();  
//        展示  gameRole.display();  
//        保存状态  RoleStateMemento roleStateMemento = gameRole.saveState();  RoleStateManage roleStateManage = new RoleStateManage();  roleStateManage.addRoleStateMemento(roleStateMemento);  System.out.println("大战-----------------------");  gameRole.fight();  
//        展示  gameRole.display();  System.out.println("大战后-----------------------");  
//        恢复状态  roleStateMemento = roleStateManage.getRoleStateMemento("张三");  gameRole.recoverState(roleStateMemento);  
//        展示  gameRole.display();  }
  • 结果![[Pasted image 20230117212002.png]]

  • 类图![[Pasted image 20230117212119.png]]

6.11.4.1 黑箱模式

  • 改进:对发起任对象提供宽接口,为其它对象提供窄接口。具体是将备忘录对象设置为发起人的内部成员类
  • 抽象备忘录接口,供外部访问
public interface Memento {  
}
  • 游戏角色
public class GameRole {  
//    角色名称  private String name;  
//    生命力  private int vita;  
//    攻击力  private int attack;  
//    防御力  private int defender;  public int getVita() {  return vita;  }  public void setVita(int vita) {  this.vita = vita;  }  public int getAttack() {  return attack;  }  public void setAttack(int attack) {  this.attack = attack;  }  public int getDefender() {  return defender;  }  public void setDefender(int defender) {  this.defender = defender;  }  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  //    初始化状态  public void initState(){  this.attack = 100;  this.vita = 100;  this.defender = 100;  }  
//    战斗  public void fight(){  this.vita -= 50;  this.attack -= 50;  this.defender -= 50;  }  
//    保存状态  public RoleStateMemento saveState(){  return new RoleStateMemento(vita,attack,defender);  }  
//    恢复角色状态  public void recoverState(Memento memento){  RoleStateMemento roleStateMemento = (RoleStateMemento) memento;  
//        将备忘录对象中数据赋值给角色对象成员  this.vita = roleStateMemento.getVita();  this.attack = roleStateMemento.getAttack();  this.defender = roleStateMemento.getDefender();  }  
//    展示角色属性  public void display(){  System.out.println("角色" + name + "属性:");  System.out.println("角色生命力:" + this.vita);  System.out.println("角色攻击力:" + this.attack);  System.out.println("角色防御力:" + this.defender);  }  //备忘录对象private class RoleStateMemento implements Memento {  //    生命力  private int vita;  //    攻击力  private int attack;  //    防御力  private int defender;  public int getVita() {  return vita;  }  public void setVita(int vita) {  this.vita = vita;  }  public int getAttack() {  return attack;  }  public void setAttack(int attack) {  this.attack = attack;  }  public int getDefender() {  return defender;  }  public void setDefender(int defender) {  this.defender = defender;  }  public RoleStateMemento(int vita, int attack, int defender) {  this.attack = attack;  this.vita = vita;  this.defender = defender;  }  }  
}
  • 管理备忘录对象
public class RoleStateManage {  
//    用集合存储备忘录对象  private Map<String, Memento> map = new HashMap<String, Memento>();  
//    添加备忘录对象  public void addRoleStateMemento(String name,Memento memento){  map.put(name,memento);  }  
//    获取备忘录对象  public Memento getRoleStateMemento(String name){  return map.get(name);  }  
}
  • 测试
    public static void main(String[] args) {  System.out.println("大战前-----------------------");  
//        创建角色  GameRole gameRole = new GameRole();  gameRole.setName("张三");  
//        初始化  gameRole.initState();  
//        展示  gameRole.display();  
//        保存状态  Memento roleStateMemento = gameRole.saveState();  RoleStateManage roleStateManage = new RoleStateManage();  roleStateManage.addRoleStateMemento("张三",roleStateMemento);  System.out.println("大战-----------------------");  gameRole.fight();  
//        展示  gameRole.display();  System.out.println("大战后-----------------------");  
//        恢复状态  Memento memento= roleStateManage.getRoleStateMemento("张三");  gameRole.recoverState(memento);  
//        展示  gameRole.display();  }
  • 结果不变,同上
  • 类图![[Pasted image 20230117214818.png]]

6.11.4 优缺点

6.11.4.1 优点

  • 提供了一种可以恢复状态的机制,当用户需要时能方便的将数据恢复到某个历史的状态
  • 实现了内部状态的封装,除了创建它的发起人外,其它对象都不能访问这些状态信息
  • 简化了发起人类,发起人不需要管理和保存其内部状态的备份,所有状态信息保存在备忘录,并有管理者进行管理,复合单一职责原则

6.11.4.2 缺点

  • 资源消耗大,若保存频繁或内部状态信息过多,会消耗内存

6.11.5 使用场景

  • 需要保存和恢复数据的场景,如游戏存档
  • 需要提供一个可回滚操作,如记事本,Word等

http://chatgpt.dhexx.cn/article/SNCJJQkp.shtml

相关文章

C++设计模式(17)——备忘录模式

亦称&#xff1a; 快照、Snapshot、Memento 意图 备忘录模式是一种行为设计模式&#xff0c; 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 问题 假如你正在开发一款文字编辑器应用程序。 除了简单的文字编辑功能外&#xff0c; 编辑器中还要有设置文本格…

Java备忘录模式(Memento)

本文我们来介绍下java23种设计模式中的备忘录模式。 备忘录模式Memento 使用场景 录入大批人员资料。正在录入当前人资料时&#xff0c;发现上一个人录错了&#xff0c; 此时需要恢复上一个人的资料&#xff0c;再进行修改。Word文档编辑时&#xff0c;忽然电脑死机或断电&a…

Java设计模式之备忘录模式

Java设计模式之备忘录模式 1. 备忘录模式概述1.1 备忘录模式简介1.2 备忘录模式类图1.3 备忘录模式的注意事项和细节 2. 备忘录模式实现2.1 项目说明2.2 项目实现 1. 备忘录模式概述 1.1 备忘录模式简介 1.备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的…

【设计模式】备忘录模式

设计模式总结链接 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式&#xff0c;是对象的行为模式。   备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下&#xff0c;将一个对象的状态捕捉(Capture)住&#xff…

23种设计模式——备忘录模式

目录 备忘录模式&#xff08;Memento&#xff09; UML图 示例代码 适用场景 优缺点 备忘录模式和原型模式 例子——游戏进度存档 例子——象棋中的悔棋 备忘录模式&#xff08;Memento&#xff09; 本质&#xff1a;保存和恢复内部状态 备忘录模式&#xff1a;在不破坏…

23种设计模式之---备忘录模式

前言 网上搜索备忘录设计模式&#xff0c;基本上均是在一个GoF&#xff0c;基础上衍生下来的。为了避免重复造轮子&#xff0c;这里会结合网上demo&#xff0c;和自己理解进行总结 定义&#xff1a;备忘录&#xff08;Memento&#xff09;模式又称标记&#xff08;Token&…

备忘录模式介绍

备忘录模式介绍 一、基本介绍二、代码实现三、UML类图四、备忘录模式小结其他设计模式 一、基本介绍 备忘录模式&#xff08;Memento Pattern&#xff09;属于行为型模式&#xff0c;是指在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外…

设计模式 | 备忘录模式及典型应用

本文的主要内容&#xff1a; 介绍备忘录模式示例备忘录模式总结 备忘录模式 备忘录模式经常可以遇到&#xff0c;譬如下面这些场景&#xff1a; 浏览器回退&#xff1a;浏览器一般有浏览记录&#xff0c;当我们在一个网页上点击几次链接之后&#xff0c;可在左上角点击左箭头…

设计模式之备忘录模式

一、备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象。备忘录模式属于行为型模式。 原发器(Originator)角色&#xff1a;原发器根据需要决定将自己的哪些内部状态保存到备忘录中&#xff0c;并可以使…

备忘录模式(Java)

备忘录模式&#xff08;Java&#xff09; 下面是关于我所写的所有设计模式代码&#xff08;还是建议自己手打或者想一个别的例子练习一次&#xff09; (https://github.com/lihang212010/DesignPatterns-/tree/master/designpatterns/src) 先来张百度的UML 下面是我例子的U…

撤销功能的实现——备忘录模式(二)

21.2 备忘录模式概述 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便地回到一个特定的历史步骤&#xff0c;当新的状态无效或者存在问题时&#xff0c;可以使用暂时存储起来的备忘录将状态复原&#xff0c;当前很多软件都提供了撤销(Undo)操作&#xff0…

18-备忘录模式

文章目录 游戏角色状态恢复问题备忘录模式基本介绍备忘录模式解决游戏角色状态回复问题备忘录模式的注意事项和细节 游戏角色状态恢复问题 游戏鱼色有攻击力和防御力&#xff0c;在大战 Boss 前保存自身的状态&#xff08;攻击力和防御力&#xff09;&#xff0c;当大战 Boss …

详解设计模式:备忘录模式

详解设计模式&#xff1a;备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;也被称为快照模式&#xff08;Snapshot Pattern&#xff09;、Token 模式&#xff08;Token Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 备忘录模式…

JAVA设计模式--备忘录模式

目录 一、什么是备忘录模式 二、备忘录模式的结构 三、备忘录模式的适用性 四、备忘录模式的实现 五、备忘录模式的优缺点 六、总结 一、什么是备忘录模式 备忘录(Memento)模式又叫作快照(Snapshot)模式或Token模式&#xff0c;是一种对象的行为模式。在备忘录模式里&am…

设计模式之备忘录模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、备忘录模式是什么&#xff1f; 备忘录模式是一种行为型的软件设计模式&#xff0c;在不破坏封装的前提下&#xff0c;获取一个…

什么是备忘录模式?

一、定义 备忘录模式又称快照模式&#xff0c;或者令牌模式。是指在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态&#xff0c;属于行为型模式。 二、通用写法及其uml 发起人角色&a…

行为型模式——备忘录模式(Memento Pattern)

文章目录 备忘录模式&#xff08;Memento Pattern&#xff09;什么是备忘录模式&#xff1f;UML角色应用使用模板 为什么要使用备忘录模式&#xff1f;优点&#xff1a;缺点&#xff1a; 怎样使用备忘录模式&#xff1f;在JDK中的使用 备忘录模式&#xff08;Memento Pattern&a…

备忘录模式

一、备忘录模式 1、定义 备忘录模式&#xff08;Memento Pattern&#xff09;又称作快照模式&#xff08;Snapshot Pattern&#xff09;&#xff0c;指在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态。这样以后就可将该对象恢复…

设计模式系列----备忘录模式

一、什么是备忘录模式 备忘录这个词汇大家应该都不陌生&#xff0c;我就经常使用备忘录来记录一些比较重要的或者容易遗忘的信息&#xff0c;与之相关的最常见的应用有许多&#xff0c;比如游戏存档&#xff0c;我们玩游戏的时候肯定有存档功能&#xff0c;旨在下一次登录游戏时…

基于MIMO讲解信道估计基本原理

为什么要进行信道估计&#xff1f; 信号在通过信道传输的时候&#xff0c;会受到信道中种种因素产生的噪声以及可能发生的多径效应&#xff0c;弄清信号经过的信道的特性&#xff0c;表征信道的技术/过程称为信道估计&#xff08;Channel Estimation&#xff09;。 注&#xf…