设计模式-备忘录模式

2,109 阅读2分钟

# 七大软件设计原则
# 设计模式-工厂模式
# 设计模式-单例模式
# 设计模式-原型模式
# 设计模式-策略模式
# 设计模式-责任链模式
# 设计模式-建造者模式
# 设计模式-深度分析代理模式
# 设计模式-门面模式
# 设计模式-装饰器模式
# 设计模式-享元模式
# 设计模式-组合模式
# 设计模式-适配器模式
# 设计模式-桥接模式
# 设计模式-委派模式
# 设计模式-模板方法模式
# 设计模式-迭代器模式
# 设计模式-命令模式

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

有点类似于“后悔药”给我们程序的开发提供后悔药,当某个功能(应为一些严重的bug)我们不想要了我们可以撤回到没开发这个功能的状态.

适用场景

  1. 需要保存历史快照的场景
  2. 希望在对象之外保存状态,且除了自己其他类对象无法访问状态保存具体内容。

就比如我们经常使用的svn、git就是个典型的备忘录模式实现,可以提交代码,可以回滚代码。(实际的开发中该模式用的还是很少的)

UML类图

image.png 具体代码如下:

@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);
    }
}

image.png

备忘录模式的优缺点:

优点:

  1. 简化发起人实体类(Originator)职责,隔离状态存储与获取,实现了信息的封装,客户端 无需关心状态的保存细节;
  2. 提供回滚功能

缺点:

  1. 消耗资源:如果需要保存的状态过多时,每一次保存都会消耗很多内存。