这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。
备忘录模式
1.什么是备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存着这个状态。这样以后就可将该对象恢复到原先保存的状态。
白话文:简单理解就是备份一个状态用于后期恢复,比如我们编辑文件中的撤销和前进功能,象棋游戏中的悔棋。
2.应用场景
1、打游戏时的存档。
2、Windows 里的 ctri + z。
3、IE 中的后退。
4、数据库的事务管理。
5、在spring-webflow流中也有用到备忘录模式,由于webflow很少用到 ,故在此不做过多讲解,感兴趣的可以看看
引入maven依赖
<dependency> <groupId>org.springframework.webflow</groupId> <artifactId>spring-webflow</artifactId> <version>2.4.5.RELEASE</version> </dependency>
然后搜索StateManageableMessageContext类
3.主要角色
Originator 发起人,负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态;
Memento 备忘录,负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento;
Caretaker 管理者,负责保存好备忘录的Memento,不能对备忘录的内容进行操作或检查。
4.代码实现
1.发起人
记录当前时刻的内部状态,并负责创建和恢复备忘录数据,允许访问返回到先前状态所需的所有数据。
``` /** * 发起人 * * @author yzm */ @Data public class Originator {
private String state;
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento m) {
this.setState(m.getState());
}
} ```
2.备忘录
负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
``` /** * 备忘录 * * @author yzm */ @Data @AllArgsConstructor public class Memento {
private String state;
} ```
3.备忘录管理者
对备忘录进行管理、保存和提供备忘录,只能将备忘录传递给其他角色。
``` /** * 管理者 * * @author yzm */ @Data public class Caretaker {
private Memento memento;
} ```
4.Client客户端
测试一下,即先将状态置为On,保存后再将状态置为Off,然后通过备忘录管理员角色恢复初始状态。
``` /** * 备忘录客户端 * * @author yzm */ public class MementoClient {
public static void main(String[] args) {
//发起人
Originator or = new Originator();
//管理者
Caretaker cr = new Caretaker();
or.setState("S0");
System.out.println("初始状态:" + or.getState());
//保存状态
cr.setMemento(or.createMemento());
or.setState("S1");
System.out.println("新的状态:" + or.getState());
//恢复状态
or.restoreMemento(cr.getMemento());
System.out.println("恢复状态:" + or.getState());
}
} ```
5.运行结果
初始状态:S0 新的状态:S1 恢复状态:S0
5.优缺点
优点
- 给用户提供了一种可以恢复状态的机制,可以使用能够比较方便地回到某个历史的状态
- 实现了信息的封装,使得用户不需要关心状态的保存细节
缺点
- 消耗资源