概念
Memento模式也叫作备忘录模式, 是行为模式之一, 他的作用是保存对象的内部状态, 并在需要的时候(undo/rollback)恢复对象以前的状态(就是保存以前的记录 以便于随时恢复到这个状态)
最原始的实现 是在客户端代码中进行 保存状态 修改 回滚和还原 非常不合理
备忘录模式结构图
![](https://img-blog.csdn.net/20170720175636296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU5NzY2NTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Orginator(原生者): 需要被保存状态以便恢复的对象
Memento(备忘录): 该对象由Orginator创建, 主要用来保存Orginator的内部状态(最简单的一个类)
Caretaker(管理者): 负责在适当的时间保存/恢复Originator对象的状态
下面是代码 其中 Person类 就是 Orginator原生类 (发起人; 创作者; 开山祖; 起因)
package design.memento;
public class Person {
private String name;
private String sex;
private Integer age;
public Person() {
}
public Person(String name, String sex, Integer age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
// 创建当前状态的一个备份
public Memento createMemento() {
return new Memento(name, sex, age);
}
// 恢复备份,还原
public void setMemento(Memento memento) {
name = memento.getName();
sex = memento.getSex();
age = memento.getAge();
}
}
public class Memento {
//与原生者持有相同的属性
private String name;
private String sex;
private Integer age;
...setter/getter
package design.memento;
public class Caretaker {
//持有备忘录的引用
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
测试代码
package design.memento;
public class MainClass {
public static void main(String[] args) {
// 创建原生者
Person person = new Person("pang", "男", 18);
// 创建管理者 并设置备忘录
Caretaker caretaker = new Caretaker();
caretaker.setMemento(person.createMemento());
System.out.println(person);
// 改变状态
person.setName("shou");
person.setSex("女");
person.setAge(80);
System.out.println(person);
// 恢复
person.setMemento(caretaker.getMemento());
System.out.println(person);
}
}
这样设计的好处是 每个类只有一个职责 (单一职责)
例如: 游戏闯关存档 读档 应用此设计模式