1、场景
1、棋类游戏中的,悔棋
2、 普通软件中的,撤销操作
3、 数据库软件中的,事务管理中的,回滚操作
4、 Photoshop软件中的,历史记录
2、核心
保存某个对象内部状态的拷贝,以后就可以将该对象恢复到原先的状态。
3、结构
- 源发器类 Originator
- 备忘录类 Memento
- 负责人类 CareTaker
4、代码实现
4.1、源发器类
java
/**
* 源发器类
*/
public class Emp {
private String name;
private int age;
private double salary;
//进行备忘操作,并返回备忘录对象
public EmpMemento memento(){
return new EmpMemento(this);
}
//进行数据恢复,恢复成制定备忘录对象的值
public void recovery(EmpMemento memento){
this.name = memento.getName();
this.age = memento.getAge();
this.salary = memento.getSalary();
}
public Emp(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Emp{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
4.2、备忘录类
java
/**
* 备忘录类
*/
public class EmpMemento {
private String name;
private int age;
private double salary;
public EmpMemento(Emp emp) {
this.name = emp.getName();
this.age = emp.getAge();
this.salary = emp.getSalary();
}
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
4.3、负责人类
java
/**
* 负责人类
* 负责管理备忘录对象
*/
public class CareTaker {
private EmpMemento empMemento;
// private List<EmpMemento> list = new ArrayList<>();
public EmpMemento getEmpMemento() {
return empMemento;
}
public void setEmpMemento(EmpMemento empMemento) {
this.empMemento = empMemento;
}
}
4.4、测试结果
5、负责人类注意点
在负责人类负责保存好的备忘录对象。可以通过增加容器,设置多个"备忘点"
java
private List<EmpMemento> list = new ArrayList<>();
备忘点较多时:
- 可以将备忘点压栈
java
public class CareTaker {
private Memento memento;
private Stack<Memento> stack = new Stack<Memento>();
}
- 将多个备忘录对象,序列化和持久化