定义
备忘录模式(Memento Pattern) 保存一个对象的某个状态,以便在适当的时候恢复对象。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。备忘录模式属于行为型模式。
模式结构
角色职责
1.发起人角色(Originator):负责创建一个备忘录,记录自身需要保存的状态,而且需要具备状态的回滚功能。
2.备忘录角色(Memento):用于存储Originator角色的内部状态,且可以防止Originator以外的对象进行访问Memento。
3.负责人角色(Caretaker):负责存储,管理备忘录功能。且其本身应该无法对备忘录的内容进行访问
代码实现
发起人:
public class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public String getState() {
return state;
}
public Memento creteMemento() {
return new Memento(state);
}
public void restore(Memento memento) {
this.setState(memento.getState());
}
}
备忘录:
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
负责人:
public class Caretaker {
private Memento memento;
public void setMemento(Memento m) {
memento = m;
}
public Memento getMemento() {
return memento;
}
}
测试结果:
public class MementoPattern {
public static void main(String[] args) {
Originator or = new Originator();
Caretaker cr = new Caretaker();
or.setState("S0");
System.out.println("初始状态:" + or.getState());
cr.setMemento(or.creteMemento()); // 保存状态
or.setState("S1");
System.out.println("新的状态:" + or.getState());
or.restore(cr.getMemento()); // 恢复状态
System.out.println("恢复状态:" + or.getState());
}
}
初始状态:S0
新的状态:S1
恢复状态:S0
适用场景
1、需要保存/恢复数据的相关状态场景。
2、提供一个可回滚的操作。
3、希望在对象之外保存状态,且除了自己其他对象无法访问状态的具体保存内容
优缺点
优点:
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。