备忘录模式(Memento Pattern)又叫作快照模式(Snapshot Pattern)或令牌模式(TokenPattern),指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态,属于行为型设计模式。

    场景

    • 保存和恢复相关状态场景
    • 需要备份和回滚

    image.png

    • Originator 发起人
    • Memento 备忘录,存储Originator的内部状态,并且放逐Orginator之外的对象访问(Memento实现类应该作为Originator的内部类)
    • Caretaker 备忘录管理器,存储和管理Memento,但无法对Memento的内容进行操作和访问。 ``` public interface IMemento {

    } public class Originator {

    1. private String state;
    2. public String getState() {
    3. return state;
    4. }
    5. public void setState(String state) {
    6. this.state = state;
    7. System.out.println("state改变"+this.state);
    8. }
    9. public IMemento createMemento(){
    10. return new Memento(this.state);
    11. }
    12. public void restoreFromMemento(IMemento memento){
    13. this.state = ((Memento)memento).getState();
    14. System.out.println("state回滚"+this.state);
    15. }
    16. static class Memento implements IMemento{
    17. private String state;
    18. private Memento(String state) {
    19. this.state = state;
    20. }
    21. private String getState() {
    22. return state;
    23. }
    24. private void setState(String state) {
    25. this.state = state;
    26. }
    27. }

    }

    public class Caretaker {

    1. private IMemento memento;
    2. public IMemento getMemento() {
    3. return memento;
    4. }
    5. public void setMemento(IMemento memento) {
    6. this.memento = memento;
    7. }

    }

    ``` Caretaker内部实现为集合类可以实现多版本控制

    克隆方式(原型模式)实现备忘录模式
    image.png

    优点

    • 提供回滚
    • 隔离状态的存储与获取

    缺点

    • 消耗内存,可以使用lru淘汰