备忘录模式定义
在不破坏封装新的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将对象恢复到原先保存的状态。通俗来说,备忘录模式就是一个对象的备份模式,提供一种程序数据的备份。
使用场景
备忘录模式,是一个后悔药机制,为什么这么说呢?举个例子,春招来了,我们什么都没准备就去面试。结果当然是显而易见的,面试失败。这时候我们的内心活动应该是要是能够重来一次多好啊,我就会提前把数据结构和算法准备好。吃了“后悔药”,时间回到面试前一个星期,我们准备了算法和数据结构,于是又去面试,面试又失败,这次被问到网络,还是有知识点不了解。回到一个星期前多好啊,就可以吧网络准备好,吃了“后悔药”,时间回到面试前一个星期,我们准备了网络,然后又一次去面试,这次的问题是操作系统知识不熟悉。。。。。。这样的循环反复回到一个星期,其实就是备忘录模式的一种体现,记住一个星期前的状态,然后一次次失败后能够回到记录的原点。
UML图
备忘录模式角色
Originator发起人角色
记录当前时刻的内部状态,负责定义那些数据备份范围的状态,负责创建和恢复备忘录Memento备忘录
负责存储Originator发起人对象的内部状态,在需要的时候提供发起人需要的内部状态数据。- Caretaker备忘录管理员角色
对备忘录进行管理、保存提供备忘录。
示例代码
class JobSeeker {
private int bloodFlow;
private int magicPoint;
public Role(int bloodFlow,int magicPoint){
this.bloodFlow = bloodFlow;
this.magicPoint = magicPoint;
}
public int getBloodFlow() {
return bloodFlow;
}
public void setBloodFlow(int bloodFlow) {
this.bloodFlow = bloodFlow;
}
public int getMagicPoint() {
return magicPoint;
}
public void setMagicPoint(int magicPoint) {
this.magicPoint = magicPoint;
}
/**
* @desc 展示角色当前状态
* @return void
*/
public void display(){
System.out.println("用户当前状态:");
System.out.println("血量:" + getBloodFlow() + ";蓝量:" + getMagicPoint());
}
/**
* @desc 保持存档、当前状态
* @return
* @return Memento
*/
public Memento saveMemento(){
return new Memento(getBloodFlow(), getMagicPoint());
}
/**
* @desc 恢复存档
* @param memento
* @return void
*/
public void restoreMemento(Memento memento){
this.bloodFlow = memento.getBloodFlow();
this.magicPoint = memento.getMagicPoint();
}
}
class Memento {
private int bloodFlow;
private int magicPoint;
public int getBloodFlow() {
return bloodFlow;
}
public void setBloodFlow(int bloodFlow) {
this.bloodFlow = bloodFlow;
}
public int getMagicPoint() {
return magicPoint;
}
public void setMagicPoint(int magicPoint) {
this.magicPoint = magicPoint;
}
public Memento(int bloodFlow,int magicPoint){
this.bloodFlow = bloodFlow;
this.magicPoint = magicPoint;
}
}
public class Caretaker {
Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}