1. 设计模式-备忘录模式

备忘录模式(Memento Pattern)是一种行为设计模式,它提供了一种在不破坏封装性的前提下,捕获并保存一个对象的内部状态,并能在以后恢复到该状态的机制。备忘录模式通常用于实现撤销操作,以及在需要时回滚到之前的状态。

备忘录模式涉及三个主要角色:

  • Originator(发起人):需要保存其内部状态的对象,它定义一个创建备忘录的接口,并且可以使用备忘录恢复其内部状态。
  • Memento(备忘录):用于存储发起人对象的内部状态,通常包含多个私有变量来存储状态信息,且提供有限的接口防止发起人以外的其他对象访问备忘录内容。
  • Caretaker(管理者):负责保存备忘录对象,但不关心备忘录的内容,只是提供一个存储位置。

假设有一个文本编辑器,我们希望实现一个撤销操作。

2. 发起人类(Originator)

public class Editor {
    private String content;

    public void type(String text) {
        content += text;
        System.out.println("Typed: " + text);
    }

    public Memento save() {
        return new Memento(content);
    }

    public void restore(Memento memento) {
        content = memento.getContent();
        System.out.println("Restored content: " + content);
    }

    public String getContent() {
        return content;
    }
}

3. 备忘录用类(Memento)

public class Memento {
    private final String content;

    public Memento(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }
}

4. 管理者类(Caretaker)

public class Caretaker {
    private Memento memento;

    public void setMemento(Memento memento) {
        this.memento = memento;
    }

    public Memento getMemento() {
        return memento;
    }
}

5.使用示例

public class Main {
    public static void main(String[] args) {
        Editor editor = new Editor();
        Caretaker caretaker = new Caretaker();

        editor.type("Hello, ");
        System.out.println("Current content: " + editor.getContent());

        caretaker.setMemento(editor.save());

        editor.type("world!");
        System.out.println("Current content: " + editor.getContent());

        editor.restore(caretaker.getMemento());
    }
}

备忘录模式是一种很好的处理对象状态恢复的模式,尤其适用于需要实现撤销/重做功能的场景,如文本编辑器、游戏进度存档等。它通过保存对象状态的快照,确保了在需要时能安全地恢复到之前的状态,同时保持了对象内部状态的封装性。然而,使用时需要权衡内存消耗和系统复杂度的增加,确保模式的合理应用。

6. 优点

  1. 简化恢复操作:通过保存和恢复对象的状态,简化了撤销操作的实现。
  2. 保持封装性:备忘录对象只暴露有限的接口,保护了发起人的内部状态不被外部直接访问。
  3. 支持多个状态回滚:可以保存多个备忘录,实现多次撤销操作。

7. 缺点

  1. 资源消耗:如果发起人对象的状态非常庞大,创建备忘录可能会消耗较多的内存资源。
  2. 类数量增加:引入了备忘录和管理者类,增加了系统的复杂度。