设计模式之备忘录模式
备忘录模式
-
备忘录模式原型图:
-
示例代码:
// 抽象备忘录接口 public interface Memento { } // 发起人角色 @Data public class Originator { private String status; public Originator(String status) { this.status = status; } public Memento createMemento(){ ConcreteMemento memento = new ConcreteMemento(); memento.setStatus(this.status); return memento; } public void restoreMemento(Memento memento){ this.status = ((ConcreteMemento) memento).getStatus(); } // 备忘录角色 @Data private static class ConcreteMemento implements Memento{ private String status; } } // 备忘录管理员角色 public class Caretaker { private final Stack<Memento> stack = new Stack<>(); public Memento getMemento(){ return stack.pop(); } public void addMemento(Memento memento){ stack.push(memento); } } // 测试 public class MementoTest { public static void main(String[] args) { Caretaker caretaker = new Caretaker(); Originator originator = new Originator("开始状态"); caretaker.addMemento(originator.createMemento()); System.out.println(originator); originator.setStatus("第一次修改状态"); caretaker.addMemento(originator.createMemento()); System.out.println(originator); originator.setStatus("第二次修改状态"); caretaker.addMemento(originator.createMemento()); System.out.println(originator); System.out.println("======开始恢复状态==========="); originator.restoreMemento(caretaker.getMemento()); System.out.println(originator); originator.restoreMemento(caretaker.getMemento()); System.out.println(originator); originator.restoreMemento(caretaker.getMemento()); System.out.println(originator); } }
-
总结:上述示例备忘录角色采用了私有静态内部类实现抽象接口的方式,主要是保证备忘录对发起人开放,具有宽访问权限,对其他类(Caretaker)对Memento具有窄访问权限.
优点:简化了发起人实体类的职责,隔离状态的存储与获取,实现了信息的封装,并提供了状态回滚功能;
缺点:消耗资源.