# 备忘录模式
Memento,在不破坏对象封装性的前提下在对象外保存对象的某个状态,以便在需要的时候将该对象恢复到该状态。备忘录模式可以用在需要保存或者恢复数据的相关状态场景下,或者提供一个回滚操作(数据库事务)。
## 组件
1. Memento:包含了要被恢复的对象的状态。
2. Originator:将状态存储进Memento中。
3. Caretaker:负责从 Memento 中恢复对象的状态。
:-: ![](https://img.kancloud.cn/6b/83/6b83ec1a09bceeb34010fde4e864987a_560x360.png)
## 实现
1. 创建Memento类
~~~
package net.smrobot.menento;
/**
* 备忘录模式
* 备忘录类:包含要恢复的对象的状态
*/
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
~~~
2. 创建Originator类
~~~
package net.smrobot.menento;
/**
* 源对象
* 在Memento对象中存储状态
*/
public class Originator {
private String state;
public String getState() {
return this.state;
}
public void setState(String state) {
this.state = state;
}
/**
* 将状态存储到Memento中
* @param state
* @return
*/
public Memento saveStateToMemento(String state) {
return new Memento(state);
}
/**
* 从Memento中获取状态
* @param memento
*/
public void getStateFromMemento(Memento memento) {
this.state = memento.getState();
}
}
~~~
3. 创建Caretaker类
~~~
package net.smrobot.menento;
import java.util.ArrayList;
import java.util.List;
/**
* 负责从Memento中恢复对象的状态
*/
public class Caretaker {
private List<Memento> mementoList = new ArrayList<>();
public void add(Memento memento) {
mementoList.add(memento);
}
public Memento get(int index) {
if (index < 0 || index >= mementoList.size()) {
return null;
}
return mementoList.get(index);
}
}
~~~
备忘录模式其实就是在要保存状态的对象中添加两个方法用户将状态保留进备忘录中或者从备忘录中获取状态。然后将所有的备忘录添加到一个容器进行维护。
- 第一章 Java基础
- ThreadLocal
- Java异常体系
- Java集合框架
- List接口及其实现类
- Queue接口及其实现类
- Set接口及其实现类
- Map接口及其实现类
- JDK1.8新特性
- Lambda表达式
- 常用函数式接口
- stream流
- 面试
- 第二章 Java虚拟机
- 第一节、运行时数据区
- 第二节、垃圾回收
- 第三节、类加载机制
- 第四节、类文件与字节码指令
- 第五节、语法糖
- 第六节、运行期优化
- 面试常见问题
- 第三章 并发编程
- 第一节、Java中的线程
- 第二节、Java中的锁
- 第三节、线程池
- 第四节、并发工具类
- AQS
- 第四章 网络编程
- WebSocket协议
- Netty
- Netty入门
- Netty-自定义协议
- 面试题
- IO
- 网络IO模型
- 第五章 操作系统
- IO
- 文件系统的相关概念
- Java几种文件读写方式性能对比
- Socket
- 内存管理
- 进程、线程、协程
- IO模型的演化过程
- 第六章 计算机网络
- 第七章 消息队列
- RabbitMQ
- 第八章 开发框架
- Spring
- Spring事务
- Spring MVC
- Spring Boot
- Mybatis
- Mybatis-Plus
- Shiro
- 第九章 数据库
- Mysql
- Mysql中的索引
- Mysql中的锁
- 面试常见问题
- Mysql中的日志
- InnoDB存储引擎
- 事务
- Redis
- redis的数据类型
- redis数据结构
- Redis主从复制
- 哨兵模式
- 面试题
- Spring Boot整合Lettuce+Redisson实现布隆过滤器
- 集群
- Redis网络IO模型
- 第十章 设计模式
- 设计模式-七大原则
- 设计模式-单例模式
- 设计模式-备忘录模式
- 设计模式-原型模式
- 设计模式-责任链模式
- 设计模式-过滤模式
- 设计模式-观察者模式
- 设计模式-工厂方法模式
- 设计模式-抽象工厂模式
- 设计模式-代理模式
- 第十一章 后端开发常用工具、库
- Docker
- Docker安装Mysql
- 第十二章 中间件
- ZooKeeper