
快照模式也称为备忘录模式,其作用是将捕获对象的状态保存起来,在需要的时候可以进行恢复。
核心结构:
A.源发器 Originator类,对象的基本状态信息类,其含两个核心方法,其一是备份操作的setMemento()方法,该方法返回一个备份对象Memento实例。另一个是恢复操作的recovery(Memento m)方法,其需要传入一个已经备份的Memento实例。
B. 快照Memento类,用于创建源发器实例的快照。其属性包含了源发器所有属性。构造方法需要传入一个需要备份的源发器Originator类实例。
C. 快照管理类,用于关联已经创建的快照对象实例。
以上三者关系及客户端调用方法如下图所示:

以下以风险投资公司对其投资的公司进行状态监测的实例,来说明快照模式的使用。
package net.mosang.memento;
* 源发器类:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
public class Originator {
private int staffNum ; //员工人数
private double profit; //毛利润
private String status; // 所处状态:上升期、平稳期、过渡期。。。。
public Memento setMemento() {
System.out.println("对当前状态进行备份操作!");
return new Memento(this);
public void recovery(Memento m) {
this.staffNum = m.getStaffNum();
this.profit = m.getProfit();
this.status = m.getStatus();
public Originator(int staffNum, double profit, String status) {
this.staffNum = staffNum;
public int getStaffNum() {
public void setStaffNum(int staffNum) {
this.staffNum = staffNum;
public double getProfit() {
public void setProfit(double profit) {
public String getStatus() {
public void setStatus(String status) {
package net.mosang.memento;
/**
* 源发器类:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
* 记录XX公司某个时间点的状态
* @author Heiry
*
*/
public class Originator {
private int staffNum ; //员工人数
private double profit; //毛利润
private String status; // 所处状态:上升期、平稳期、过渡期。。。。
//备份操作
public Memento setMemento() {
System.out.println("对当前状态进行备份操作!");
return new Memento(this);
}
//恢复操作
public void recovery(Memento m) {
this.staffNum = m.getStaffNum();
this.profit = m.getProfit();
this.status = m.getStatus();
}
public Originator(int staffNum, double profit, String status) {
super();
this.staffNum = staffNum;
this.profit = profit;
this.status = status;
}
public int getStaffNum() {
return staffNum;
}
public void setStaffNum(int staffNum) {
this.staffNum = staffNum;
}
public double getProfit() {
return profit;
}
public void setProfit(double profit) {
this.profit = profit;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package net.mosang.memento;
/**
* 源发器类:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
* 记录XX公司某个时间点的状态
* @author Heiry
*
*/
public class Originator {
private int staffNum ; //员工人数
private double profit; //毛利润
private String status; // 所处状态:上升期、平稳期、过渡期。。。。
//备份操作
public Memento setMemento() {
System.out.println("对当前状态进行备份操作!");
return new Memento(this);
}
//恢复操作
public void recovery(Memento m) {
this.staffNum = m.getStaffNum();
this.profit = m.getProfit();
this.status = m.getStatus();
}
public Originator(int staffNum, double profit, String status) {
super();
this.staffNum = staffNum;
this.profit = profit;
this.status = status;
}
public int getStaffNum() {
return staffNum;
}
public void setStaffNum(int staffNum) {
this.staffNum = staffNum;
}
public double getProfit() {
return profit;
}
public void setProfit(double profit) {
this.profit = profit;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package net.mosang.memento;
private int staffNum ; //需要保存的员工人数数据
private double profit; //需要保存的毛利润数据
private String status; // 需要保存的公司状态信息
public Memento(Originator originator) {
this.staffNum = originator.getStaffNum();
this.profit = originator.getProfit();
this.status = originator.getStatus();
public int getStaffNum() {
public void setStaffNum(int staffNum) {
this.staffNum = staffNum;
public double getProfit() {
public void setProfit(double profit) {
public String getStatus() {
public void setStatus(String status) {
package net.mosang.memento;
/**
* 备忘录类
* @author Heiry
*
*/
public class Memento {
private int staffNum ; //需要保存的员工人数数据
private double profit; //需要保存的毛利润数据
private String status; // 需要保存的公司状态信息
public Memento(Originator originator) {
this.staffNum = originator.getStaffNum();
this.profit = originator.getProfit();
this.status = originator.getStatus();
}
public int getStaffNum() {
return staffNum;
}
public void setStaffNum(int staffNum) {
this.staffNum = staffNum;
}
public double getProfit() {
return profit;
}
public void setProfit(double profit) {
this.profit = profit;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package net.mosang.memento;
/**
* 备忘录类
* @author Heiry
*
*/
public class Memento {
private int staffNum ; //需要保存的员工人数数据
private double profit; //需要保存的毛利润数据
private String status; // 需要保存的公司状态信息
public Memento(Originator originator) {
this.staffNum = originator.getStaffNum();
this.profit = originator.getProfit();
this.status = originator.getStatus();
}
public int getStaffNum() {
return staffNum;
}
public void setStaffNum(int staffNum) {
this.staffNum = staffNum;
}
public double getProfit() {
return profit;
}
public void setProfit(double profit) {
this.profit = profit;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package net.mosang.memento;
* 管理者类:负责对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
private Memento memento; //对备忘录对象做保存、中转,如果有多个备忘录状态需要保存或中转,可用集合
public Memento getMemento() {
public void setMemento(Memento memento) {
package net.mosang.memento;
/**
* 管理者类:负责对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
* 实际上是作为一个中间临时值的中转作用
* @author Heiry
*
*/
public class Caretaker {
private Memento memento; //对备忘录对象做保存、中转,如果有多个备忘录状态需要保存或中转,可用集合
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
package net.mosang.memento;
/**
* 管理者类:负责对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
* 实际上是作为一个中间临时值的中转作用
* @author Heiry
*
*/
public class Caretaker {
private Memento memento; //对备忘录对象做保存、中转,如果有多个备忘录状态需要保存或中转,可用集合
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
package net.mosang.memento;
public static void main(String[] args) {
Caretaker caretaker = new Caretaker();
Originator og1 = new Originator(100, 8000, "创业期");
caretaker.setMemento(og1.setMemento());
System.out.println("新的公司状态为:StaffNum-->"+og1.getStaffNum()+"Profit-->"+og1.getProfit()+"Status-->"+og1.getStatus());
og1.recovery(caretaker.getMemento());
System.out.println("恢复后的公司状态为:StaffNum-->"+og1.getStaffNum()+"Profit-->"+og1.getProfit()+"Status-->"+og1.getStatus());
package net.mosang.memento;
/**
* 客户端类
* @author Heiry
*
*/
public class Client {
public static void main(String[] args) {
Caretaker caretaker = new Caretaker();
//创建XX公司某时间的状态
Originator og1 = new Originator(100, 8000, "创业期");
// 进行当前状态的备份
caretaker.setMemento(og1.setMemento());
//对当前状态做更改
og1.setStaffNum(200);
og1.setProfit(9000);
og1.setStatus("平稳期");
System.out.println("新的公司状态为:StaffNum-->"+og1.getStaffNum()+"Profit-->"+og1.getProfit()+"Status-->"+og1.getStatus());
//对备份的状态进行恢复
og1.recovery(caretaker.getMemento());
System.out.println("恢复后的公司状态为:StaffNum-->"+og1.getStaffNum()+"Profit-->"+og1.getProfit()+"Status-->"+og1.getStatus());
}
}
package net.mosang.memento;
/**
* 客户端类
* @author Heiry
*
*/
public class Client {
public static void main(String[] args) {
Caretaker caretaker = new Caretaker();
//创建XX公司某时间的状态
Originator og1 = new Originator(100, 8000, "创业期");
// 进行当前状态的备份
caretaker.setMemento(og1.setMemento());
//对当前状态做更改
og1.setStaffNum(200);
og1.setProfit(9000);
og1.setStatus("平稳期");
System.out.println("新的公司状态为:StaffNum-->"+og1.getStaffNum()+"Profit-->"+og1.getProfit()+"Status-->"+og1.getStatus());
//对备份的状态进行恢复
og1.recovery(caretaker.getMemento());
System.out.println("恢复后的公司状态为:StaffNum-->"+og1.getStaffNum()+"Profit-->"+og1.getProfit()+"Status-->"+og1.getStatus());
}
}
输出结果如下:
新的公司状态为:StaffNum-->200Profit-->9000.0Status-->平稳期
恢复后的公司状态为:StaffNum-->100Profit-->8000.0Status-->创业期
对当前状态进行备份操作!
新的公司状态为:StaffNum-->200Profit-->9000.0Status-->平稳期
恢复后的公司状态为:StaffNum-->100Profit-->8000.0Status-->创业期
对当前状态进行备份操作!
新的公司状态为:StaffNum-->200Profit-->9000.0Status-->平稳期
恢复后的公司状态为:StaffNum-->100Profit-->8000.0Status-->创业期