备忘录模式Memento
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 实现了信息的封装,使得用户不需要关心状态的保存细节。
1.场景
- Word编辑时断电,重新开机,恢复到编辑时状态
- 打游戏时的存档。
- Windows 里的 ctri + z。
- 数据库的事务管理。
2.结构
源发器类Originator
备忘录类Memento
负责人类CareTaker
//源发器类Originator
package com.liang.memento;
public class Emp {
private String ename;
private int age;
private String dept;
//数据备份
public EmpMemento memento() {
return new EmpMemento(this);
}
//数据恢复
public void recover(EmpMemento m) {
this.ename = m.getEname();
this.age = m.getAge();
this.dept = m.getDept();
}
public Emp(String ename, int age, String dept) {
super();
this.ename = ename;
this.age = age;
this.dept = dept;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
}
//备忘录类Memento
package com.liang.memento;
public class EmpMemento {
private String ename;
private int age;
private String dept;
//数据备份
public EmpMemento(Emp e) {
this.ename=e.getEname();
this.age=e.getAge();
this.dept=e.getDept();
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
}
package com.liang.memento;
import java.util.ArrayList;
import java.util.List;
/**
* 负责人类,管理备忘录对象
* @author Administrator
*
*/
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;
}
}
package com.liang.memento;
public class Client {
public static void main(String[] args) {
CareTaker taker=new CareTaker();
Emp e=new Emp("张三", 23, "研发部");
System.out.println(e.getEname()+"--"+e.getAge()+"--"+e.getDept());
taker.setEmpMemento(e.memento());//备忘一次
e.setAge(45);
e.setEname("李四");
System.out.println(e.getEname()+"--"+e.getAge()+"--"+e.getDept());
e.recover(taker.getEmpMemento());//恢复
System.out.println(e.getEname()+"--"+e.getAge()+"--"+e.getDept());
}
}