备忘录模式( Memento Pattern )又称为快照模式( Snapshot Pattern )或令牌模式( Token Pattern),是指在不破坏封装的前提下,捕获一个对象的内部状态,井在对象之外保存这个状 态。这样以后就可将该对象恢复到原先保存的状态,属于行为型模式。
有点类似于“后悔药”给我们程序的开发提供后悔药,当某个功能(应为一些严重的 bug)我们不想要了我们可以撤回到没开发这个功能的状态.
适用场景
需要保存历史快照的场景
希望在对象之外保存状态,且除了自己其他类对象无法访问状态保存具体内容。
就比如我们经常使用的 svn、git 就是个典型的备忘录模式实现,可以提交代码,可以回滚代码。(实际的开发中该模式用的还是很少的)
UML 类图
具体代码如下:
@Getter
@Setter
@ToString
public class Originator {
private String state;
public Memento saveToMemento(){
return new Memento(state);
}
public void restoreMemento(Memento memento){
this.state = memento.getState();
}
}
复制代码
@Getter
@Setter
@ToString
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
}
复制代码
public class Caretaker {
private final Stack<Memento> stack = new Stack<Memento>();
public void addMemento(Memento memento) {
stack.push(memento);
}
public Memento getMemento() {
return stack.pop();
}
}
复制代码
备忘录管理者这里采用了栈的存储方式
public class Test {
public static void main(String[] args) {
Originator originator = new Originator();
originator.setState("1");
Caretaker caretaker = new Caretaker();
caretaker.addMemento(originator.saveToMemento());
originator.setState("2");
originator.setState("3");
System.out.println(originator);
originator.restoreMemento(caretaker.getMemento());
System.out.println(originator);
}
}
复制代码
备忘录模式的优缺点:
优点:
简化发起人实体类(Originator)职责,隔离状态存储与获取,实现了信息的封装,客户端 无需关心状态的保存细节;
提供回滚功能
缺点:
消耗资源:如果需要保存的状态过多时,每一次保存都会消耗很多内存。
评论