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

article/2025/11/11 17:09:08

目录

备忘录模式(Memento)

UML图

示例代码

适用场景

优缺点

备忘录模式和原型模式

例子——游戏进度存档

例子——象棋中的悔棋


备忘录模式(Memento)

本质:保存和恢复内部状态

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以后就可以利用保存的状态实施恢复。

为什么要增加一个备忘录类?

如果在Originator类中再增加一个方法来保存这个状态,则是对单一职责原则的一种破坏。

在游戏存档例子中,Gamerole类的职责就是打boss,而保留和恢复原始状态则应该由另外一个类来承担,那我们把这个类取名就叫做备忘录

UML图

在这里插入图片描述
Originator(发起人):需要被存储和恢复状态的角色

  • 创建一个备忘录,存储自己的当前内部状态
  • 使用备忘录来恢复自己的内部状态

Memento(备忘录):(类的设计参考发起人)

存储发起人的内部状态,根据实际需要确定备忘录类中的属性。

Caretaker(管理者):

存储一个或多个备忘录对象,但只负责存储,所以不能修改对象,也无须知道对象的实现细节。

存储多个备忘录对象时,可以使用list+泛型

示例代码

//发起人类
public class Originator {private String state;public String getState() {return state;}public void setState(String state) {this.state = state;}public Memento CreateMemento() {return new Memento(state);}//恢复状态public void SetMemento(Memento memento) {state=memento.getState();}public void show() {System.out.println("state:"+state);}
}
//备忘录类
public class Memento {private String state;public Memento(String state) {super();this.state = state;}public String getState() {return state;}}
//管理者类
public class CareTaker {private Memento memento;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}
public class Main {public static void main(String[] args) {Originator o=new Originator();o.setState("ON");//初始状态o.show();CareTaker c=new CareTaker();c.setMemento(o.CreateMemento());//保存状态o.setState("OFF");//改变状态o.show();o.SetMemento(c.getMemento());//恢复初始状态o.show();}}

适用场景

保存一个对象在某一个时刻的全部或部分状态,在以后需要时,把该对象恢复到先前的状态

优缺点

优点:

  • 把发起人内部信息对外屏蔽,恰当地保持封装的边界:有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取
  • 简化了发起人类:发起人不需要管理和保存其内部状态的一个个版本,客户端可以自行管理需要状态的版本。
  • 当发起人对象的状态改变无效时,可以使用备忘录将状态复原。

缺点:

  • 如果发起人对象的状态需要完整地存储到备忘录对象中,那么在备忘录对象可能会消耗很多资源。
  • 管理者存储备忘录对象时,可能不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很大。

备忘录模式和原型模式

可以组合使用

在发起人对象创建备忘录对象时,如果发起人对象中全部或者大部分的状态都需要保存,一个简洁的方式就是直接克隆一个发起人对象。这时备忘录对象里存的是一个发起人对象的实例。

例子——游戏进度存档

public class GameRole {private int vit;//生命力private int atk;//攻击力private int def;//防御力//设置初始状态public void setInitState() {this.vit=100;this.atk=100;this.def=100;}//设置战后状态public void fight() {this.vit=0;this.atk=0;this.def=0;}//保存状态public RoleStateMemento saveState() {return new RoleStateMemento(vit,atk,def);}//恢复状态public void RecoverState(RoleStateMemento memento) {this.vit=memento.getVit();this.atk=memento.getAtk();this.def=memento.getDef();}//显示状态public void display() {System.out.println("vit=" + vit + ", atk=" + atk + ", def=" + def );}}
//角色状态存储箱
public class RoleStateMemento {private int vit;//生命力private int atk;//攻击力private int def;//防御力public RoleStateMemento(int vit, int atk, int def) {super();this.vit = vit;this.atk = atk;this.def = def;}public int getVit() {return vit;}public void setVit(int vit) {this.vit = vit;}public int getAtk() {return atk;}public void setAtk(int atk) {this.atk = atk;}public int getDef() {return def;}public void setDef(int def) {this.def = def;}}
//角色状态管理者
public class RoleStateCareTaker {private RoleStateMemento memento;public RoleStateMemento getMemento() {return memento;}public void setMemento(RoleStateMemento memento) {this.memento = memento;}}
public class Main {public static void main(String[] args) {//大战前GameRole lxy=new GameRole();lxy.setInitState();lxy.display();//保存进度RoleStateCareTaker state1=new RoleStateCareTaker();state1.setMemento(lxy.saveState());//大战后lxy.fight();lxy.display();//恢复原状态lxy.RecoverState(state1.getMemento());lxy.display();}}

例子——象棋中的悔棋

package com.chess;//发起人
public class ChessRole {private int x;private int y;private String name;private String color;public ChessRole(int x, int y, String name, String color) {super();this.x = x;this.y = y;this.name = name;this.color = color;}public ChessMemento createMemento() {return new ChessMemento(x,y,name,color);}public void getMemento(ChessMemento memento) {if(memento==null)return;this.x=memento.getX();this.y=memento.getY();this.name=memento.getName();this.color=memento.getColor();}public void setState(int x, int y, String name, String color) {this.x=x;this.y=y;this.name = name;this.color = color;}public void show() {System.out.println("坐标:x=" + x + ", y=" + y + ", name=" + name + ", color=" + color);}}
package com.chess;public class ChessMemento {private int x;private int y;private String name;private String color;public ChessMemento(int x, int y, String name, String color) {super();this.x = x;this.y = y;this.name = name;this.color = color;}public int getX() {return x;}public int getY() {return y;}public String getName() {return name;}public String getColor() {return color;}}
package com.chess;import java.util.ArrayList;public class ChessCareTaker {private ArrayList<ChessMemento> list=new ArrayList<ChessMemento>();public ChessCareTaker() {list=new ArrayList<ChessMemento>();}public void addMemento(ChessMemento memento) {list.add(memento);}public ChessMemento huiqi() {if(list.isEmpty()) {System.out.println("无法悔棋");return null;}else {int index=list.size();ChessMemento memento=(ChessMemento)list.get(index-1);list.remove(index-1);return memento;}}}
package com.chess;public class Main {public static void main(String[] args) {ChessRole c1=new ChessRole(0,0,"马1","红方");ChessCareTaker ct1=new ChessCareTaker();ct1.addMemento(c1.createMemento());c1.show();c1.setState(1, 2, "马1", "红方");ct1.addMemento(c1.createMemento());c1.show();c1.setState(3, 5, "象2", "红方");c1.show();System.out.println("悔棋一步:");c1.getMemento(ct1.huiqi());c1.show();System.out.println("悔棋二步:");c1.getMemento(ct1.huiqi());c1.show();}}


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

相关文章

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…

m基于深度学习的OFDM信道估计和均衡算法误码率matlab仿真,对比了LS,MMSE以及LMMSE等传统的信道估计算法

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着无线通信的快速发展,5G正逐渐成长为支撑全社会各行业运作的大型基础性互联网络,其服务范围的大幅扩展对底层技术提出了诸多挑战,尤其是作为物理层关键技术之一的正交频分复用(Orthogonal Fre…

IRS的信道估计基础代码

一、 智能反射平面&#xff08;intelligent reflecting surfaces&#xff09;是一种被动反射表面&#xff0c;其具有的特性是可控制反射信号的相位。 明确IRS是可控制反射信号的相位&#xff0c;所以以单个智能反射单元为例&#xff0c;该单元可调信号的参数可表示为​&#xf…

信道估计算法

目前我所涉及的是短波宽带无线信道下的接收端的处理&#xff0c;包括捕获、同步、信道估计及信道均衡&#xff0c;还有译码。百度百科里是这样解释这种信道的&#xff1a;短波通信发射电波要经电离层的反射才能到达接收设备&#xff0c;通信距离较远&#xff0c;是远程通信的主…

信道估计之LS算法

信道估计之LS算法 前言LS信道估计的原理总结 前言 信道估计是通信系统接收机的重要功能模块&#xff0c;主要是用来估计信号所经历信道的冲击响应&#xff0c;并用于后续的信道均衡处理&#xff0c;以便消除多径信号混叠造成的ISI。 信道估计的方法有很多种&#xff0c;…

信道估计之LMMSE估计

之前的内容讲到了MMSE信道估计&#xff0c;并推导了基于MMSE优化准则的估计结果&#xff0c;该方法是对LS信道估计的进一步优化&#xff0c;适用于低信噪比场合&#xff0c;但由于其计算复杂&#xff0c;所以并不实用。因此又有了LMMSE信道估计方法&#xff0c;相对于MMSE估计&…