备忘录模式
备忘录模式属于行为型模式
定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
其实就是在某个时刻备份了对象的状态,在更改对象状态后,可以通过备份将对象还原成备份时刻的状态
模式类图
角色
- 原始对象:
Originator
原对象,提供创建备份,和恢复备份数据功能 - 备忘录:
Memento
负责存储Originator
对象的内部状态,在需要的时候提供发起人需要的内部状态 - 备忘录管理员:
Caretaker
对备忘录进行管理、保存和提供备忘录
优点
- 提供一种可以备份恢复的机制,客户端可以方便的恢复某个历史状态
- 封装性好,客户端不需要关心状态的保存细节
缺点
如果状态太多,会导致类膨胀
模式代码实现
源码地址:https://github.com/mingyuHub/design-patterns
原始对象
提供创建备份,和恢复备份数据功能
/**
* @author: chenmingyu
* @date: 2019/3/25 20:42
* @description: 原始对象
*/
@Data
public class Originator{
private String name;
/**
* 创建备忘录
* @return
* @throws CloneNotSupportedException
*/
public Memento createMemento(){
return new Memento(this.getName());
}
/**
* 恢复一个备忘录
* @param memento
*/
public void restoreMemento(Memento memento){
this.setName(memento.getName());
}
public Originator(String name) {
this.name = name;
}
}
备忘录
负责存储Originator
的内在状态
/**
* @author: chenmingyu
* @date: 2019/3/25 20:47
* @description: 备忘录
*/
@Data
public class Memento {
private String name;
public Memento(String name) {
this.name = name;
}
}
备忘录管理员
持有Memento
d的实例
/**
* @author: chenmingyu
* @date: 2019/3/25 20:57
* @description: 备忘录管理员
*/
@Data
public class Caretaker {
private Memento memento;
public Caretaker(Memento memento) {
this.memento = memento;
}
}
验证
public static void main(String[] args) {
Originator originator = new Originator("mingyu");
Caretaker caretaker = new Caretaker(originator.createMemento());
System.out.println(originator.getName());
System.out.println("……");
originator.setName("wuwu");
System.out.println(originator.getName());
System.out.println("……");
originator.restoreMemento(caretaker.getMemento());
System.out.println(originator.getName());
}
输出
mingyu
……
wuwu
……
mingyu
参考:设计模式之禅:https://www.kancloud.cn/sstd521/design/193597
推荐阅读:23种设计模式详解