JAVA设计模式之备忘录模式
概念:
备忘录模式(memento),保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。
结构
原发器类Originator:保存对象内部状态
备忘录类Memento:存储状态的拷贝
负责人类CareTake:存储备忘录
应用
- 棋类开发中的悔棋
- 普通软件的撤销
- 数据库软件中,事务管理的回滚操作
类图
代码
代码类图:
// 源发器类
public class Emp {
private String name;
private int age;
// 进行备忘操作,返回备忘录对象
public EmpMemento memento() {
return new EmpMemento(this);
}
// 进行数据恢复,恢复成指定备忘录的值
public void recovery(EmpMemento mmt) {
this.name = mmt.getName();
this.age = mmt.getAge();
}
public Emp(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 备忘录类
public class EmpMemento {
private String name;
private int age;
public EmpMemento(Emp emp) {
this.name = emp.getName();
this.age = emp.getAge();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 负责人类, 负责管理备忘录
public class CareTake {
private List empMementoList = new ArrayList<>();//用stack更好,还可以序列化和持久化,存到磁盘,以防丢失
public void addMemento(EmpMemento empMemento) {
empMementoList.add(empMemento);
}
// 按顺序逐个恢复
public EmpMemento getLastMemento() {
if (empMementoList.size() <= 0) {
return null;
}
int index = empMementoList.size() - 1;
EmpMemento result = empMementoList.get(index);
empMementoList.remove(index);
return result;
}
}
public class Main {
public static void main(String[] args) {
CareTake taker = new CareTake();
Emp emp = new Emp("55", 15);
taker.addMemento(emp.memento());
System.out.println(JSON.toJSONString(emp));
emp.setAge(16);
taker.addMemento(emp.memento());
System.out.println(JSON.toJSONString(emp));
emp.setAge(17);
System.out.println(JSON.toJSONString(emp));
emp.recovery(taker.getLastMemento());
System.out.println(JSON.toJSONString(emp));
emp.recovery(taker.getLastMemento());
System.out.println(JSON.toJSONString(emp));
}
}