一、场景
- 录入大批人员资料。正在录入当前资料时,发现上一个录错了,此时需要回复上一个资料,再进行修改
-
word
文档编辑时,忽然电脑死机了,再打开时,可以看到word
提示你回复到以前的文档 - 管理系统中,公文撤回功能。公文发送出去后,想车回来
二、核心
就是保存某个对象内部状态的拷贝,这样以后就可以将该对象回复到原先的状态
三、结构
- 源发器类
Originatot
- 备忘录类
Memento
- 负责人类
CareTaker
Emp.java
package cn.itcast.day253.memento;
//源发器类
public class Emp {
private String name ;
private int age ;
private double salary;
//备忘操作,并返回备忘录对象
public EmpMemento memento(){
return new EmpMemento(this);
}
//数据回复,回复成指定备忘录的值
public void recovery(EmpMemento mmt){
this.name = mmt.getName();
this.age = mmt.getAge();
this.salary = mmt.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;
}
}
EmpMemento.java
package cn.itcast.day253.memento;
//备忘录类:保存源发器类中的相关信息
public class EmpMemento {
private String name ;
private int age ;
private double salary;
public EmpMemento(Emp e){
this.name = e.getName();
this.age = e.getAge();
this.salary = e.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;
}
}
CareTaker.java
package cn.itcast.day253.memento;
//负责人类:负责管理备忘录对象
public class CareTaker {
private EmpMemento memento;//当然这里我们也可以是一个容器,这样就可以存储很多个备忘点,最好是一个栈
public EmpMemento getMemento() {
return memento;
}
public void setMemento(EmpMemento memento) {
this.memento = memento;
}
}
说明:一个源发器类用来保存我们操作对象的信息,而备忘录类就是保存我们操作过程中的一些状态信息,同时有一个负责人类专门来管理备忘录类,用来撤销等操作。
Client.java
package cn.itcast.day253.memento;
public class Client {
public static void main(String[] args) {
CareTaker taker = new CareTaker();
Emp emp = new Emp("yj", 26, 12000);
System.out.println("第一次:" + emp.getName() + ",年龄:" + emp.getAge()
+ ",工资:" + emp.getSalary());
taker.setMemento(emp.memento());//备份
emp.setAge(27);
emp.setSalary(21000);
System.out.println("第二次:" + emp.getName() + ",年龄:" + emp.getAge()
+ ",工资:" + emp.getSalary());
emp.recovery(taker.getMemento());//恢复
System.out.println("第三次:" + emp.getName() + ",年龄:" + emp.getAge()
+ ",工资:" + emp.getSalary());
}
}
四、开发中常见的场景
- 棋类游戏中,悔棋
- 普通软件中,撤销操作
- 数据库软件中,事物管理中的回滚操作
网友评论