设计模式之备忘录模式
为什么要用备忘录模式
- 保存某个对象内部的拷贝,这样以后就可以将对象原先的状态。
结构:
- 源发器类:负责创建一个备忘录,用以记录当前对象的内部状态,通过也可以使用它来利用备忘录恢复内部状态。
- 备忘录类:用于存储源发器的内部状态。
- 负责人类:管理备忘录类。
模式实现:
- 我们就以保存员工信息为实现场景,在挑战第一次保存之后,员工的姓名,年龄,工资,然后存档,在对信息进行修改时,由于操作失误导致信息错误,所以只好恢复到刚刚开始的存档,这里使用备忘录模式来实现
UML图
备忘录模式怎么用
package memento;
/**
* 源发器类 对象内部的状态
*/
public class Emp {
private String name;
private int age;
private double salary;
// 进行备忘操纵,返回备忘录对象
public Empmemento memento() {
return new Empmemento(this);
}
// 进行数据恢复,回复称指定备忘录的值
public void recovery(Empmemento eme) {
this.name = eme.getName();
this.age = eme.getAge();
this.salary = eme.getSalary();
}
public Emp(String name, int age, double salary) {
super();
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;
}
}
package memento;
/**
*
*
*/
public class Empmemento {
private String name;
private int age;
private double salary;
public Empmemento(Emp e) {
this.age = e.getAge();
this.name = e.getName();
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;
}
}
package memento;
/**
* 负责人类
* 管理备忘录对象
*/
public class CareTaker {
private Empmemento empme;
// 当备忘录较多时,使用压栈的方式保存备忘录
// private Stack<Empmemento> stack = new Stack<Empmemento>();
public Empmemento getEmpme() {
return empme;
}
public void setEmpme(Empmemento empme) {
this.empme = empme;
}
}
package memento;
public class Client {
public static void main(String[] args) {
CareTaker care = new CareTaker();
Emp emp = new Emp("zhaojianyin", 23, 1000.0);
System.out.println("第一次的数据:name :"+emp.getName()+" age :"+emp.getAge()+" salary :"+emp.getSalary());
//备份
care.setEmpme(emp.memento());
emp.setAge(44);
emp.setName("zhang jun");
emp.setSalary(66666.0);
System.out.println("第二次的数据:name :"+emp.getName()+" age :"+emp.getAge()+" salary :"+emp.getSalary());
//恢复
emp.recovery(care.getEmpme());
System.out.println("第三次的数据:name :"+emp.getName()+" age :"+emp.getAge()+" salary :"+emp.getSalary());
}
}
运行结果:
第一次的数据:name :zhaojianyin age :23 salary :1000.0
第二次的数据:name :zhang jun age :44 salary :66666.0
第三次的数据:name :zhaojianyin age :23 salary :1000.0
什么时候用备忘录模式
- 棋类游戏中悔棋,
- 普通软件中,操作。
- 数据库软件中,事务管理中的,回滚操作。