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