Java设计模式之备忘录模式实现对象状态的保存和恢复
作者:.番茄炒蛋 发布时间:2023-08-28 15:22:27
介绍
备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获并保存一个对象的内部状态,并在之后可以恢复该对象到先前的状态.该模式的核心是备忘录(Memento)类,它储存了一个对象的内部状态.
在Java中,备忘录模式可以通过定义一个备忘录类来实现.备忘录类通常包含一个或多个私有字段来储存要保存的对象的内部状态.备忘录类还可以提供公共方法来获取和设置这些字段.原始对象可以使用备忘录类创建备忘录,并将其保存到历史记录中.在需要恢复对象的状态时,原始对象可以从历史记录中获取备忘录,并使用备忘录来恢复其状态.
在备忘录模式中,一般会涉及到以下三个角色:
Originator(发起人):它是要被保存状态的对象.它提供了创建备忘录和恢复备忘录的接口,允许其他对象获取其内部状态.
Memento(备忘录):它用于储存Originator内部状态得对象.备忘录可以根据Originator得需求来保存其内部状态,并且可以防止Originator以外得其他对象访问该状态.
Caretaker(管理者):它负责保存备忘录,并在需要时将其提供给Originator进行恢复,Caretaker可以储存多个备忘录,以及支持多次撤销操作.
在Java中实现备忘录模式时,一般会涉及到以上三个角色.其中Originator和Memento是必需的,Caretaker可以根据实际需要来选择是否实现.
实现
假设有一个游戏角色类Role,它有三个属性:attack(攻击力),defense(防御力)和hp(生命值).现在我们要实现一个备忘录模式,可以保存角色的状态,并在需要时恢复角色的状态.
备忘录类
@Data
public class Memento {
/**
* 攻击力
*/
private int attack;
/**
* 防御力
*/
private int defense;
/**
* 生命值
*/
private int hp;
public Memento(int attack, int defense, int hp) {
this.attack = attack;
this.defense = defense;
this.hp = hp;
}
}
发起人类
@Data
public class Role {
/**
* 攻击力
*/
private int attack;
/**
* 防御力
*/
private int defense;
/**
* 生命值
*/
private int hp;
public Role(int attack, int defense, int hp) {
this.attack = attack;
this.defense = defense;
this.hp = hp;
}
/**
* 将当前对象储存值Memento中
* @return
*/
public Memento save(){
return new Memento(attack,defense,hp);
}
/**
* 从memento中获取状态;并恢复到当前状态
* @param memento
*/
public void restore(Memento memento){
attack = memento.getAttack();
defense = memento.getDefense();
hp = memento.getHp();
}
}
管理者类
public class Caretaker {
private List<Memento> mementos = new ArrayList<>();
public void addMemento(Memento m){
mementos.add(m);
}
public Memento getMemento(int index){
return mementos.get(index);
}
}
测试
public class Demo {
public static void main(String[] args) {
Role role = new Role(100,50,20);
Caretaker caretaker = new Caretaker();
Memento memento = role.save();
caretaker.addMemento(memento);
// 攻击力+10
role.setAttack(role.getAttack()+10);
System.out.println(JSON.toJSONString(role));
// 恢复
role.restore(caretaker.getMemento(0));
System.out.println(JSON.toJSONString(role));
}
}
这是一个完整的备忘录模式的例子.在这个例子中,我们创建一个备忘录类Memento,它保存了角色的攻击力,防御力和生命值.我们还创建了一个角色类Role,它可以保存和恢复角色的状态.最后.我们创建了一个Caretaker类,它用于保存Memento对象.通过这些类的结合使用,我们实现了备忘录模式.
来源:https://blog.csdn.net/qq_43135259/article/details/129668905
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 简介对于一个APP来说,肯定会有一个AppBar,这个AppBar一般包含了APP的导航信息等。虽然我们可以用一个固定的组件来做为AppBa
- 本文实例讲述了Java实现的不同图片居中剪裁生成同一尺寸缩略图功能。分享给大家供大家参考,具体如下:因为业务需要,写了这样一个简单类,希望能
- 1)首先启动hadoop2个进程,进入hadoop/sbin目录下,依次启动如下命令[root@node02 sbin]# pwd/usr/
- 一、@Value读取application.properties配置文件中的值application.properties配置文件fileN
- AndroidStduio3.0使用gradle将module打包jar文件,首先需要安装gradle。打开控制台输入  
- 前言工作中使用mybatis时我们需要根据数据表字段创建pojo类、mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作
- 这几天自己研究了关于地手机上面开发安卓地图的问题,发现百度官方示例demo讲解百度持续定位方面还是讲解的有些不清楚,本人研究了几次之后将其弄
- 一个发送验证码的需求:包括限制文本框输入长度和只允许输入数字按惯例 先上图:class MyBody extends StatefulWid
- 合成聚合复用原则合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP
- static修饰符是java里面非常常用的一个东西,用法也非常多。然而,在kotlin里竟然没有这个东西!那该如何替代呢?本文就总结了下ja
- 一、interrupt的使用特点我们先看2个线程打断的示例首先是可打断的情况:@Testpublic void interruptedTes
- 前几篇主要集中在注册中心eureka的使用上,接下来可以创建服务提供者provider来注册到eureka。demo源码见: https:/
- 从功能上说,可以分为两部分,分布式功能和数据功能。分布式功能主要是节点集群及集群附属功能如restful借口、集群性能检测功能等,数据功能主
- 本文实例为大家分享了Android绝对布局AbsoluteLayout的具体代码,供大家参考,具体内容如下1>AbsoluteLayo
- 有时候,我们在同一个activity里面有很多fragment,在横竖屏的时候,有些fragment要求重新加载数据,有些不需要,如何简单控
- Android 应用签名的两种方法一、使用pem签名 (一) apk签名命令java –jar sign
- 走马灯是一种常见的效果,本文讲一下如何用 PageView 在 Flutter 里实现一个走马灯, 效果如下,当前页面的高度比其它页面高,切
- java有两种类型的classload,一种是user-defined的,一种是jvm内置的bootstrap class loader,所
- 在java.lang.Runtime.exec的使用中,我们经常会用到将重定向命令执行的输入/结果或者将错误信息读取出来.那么,在使用过程中
- 实现的效果图:自定义Fragment继承BottomSheetDialogFragment重写它的三个方法:onCreateDialog()