返回

书读薄,始见深:《设计模式之美》行为型之备忘录模式

Android

备忘录模式:保存状态,撤销操作

简介

在软件开发中,我们常常需要保存一个对象的当前状态,以便稍后可以恢复它。这在各种情况下都很常见,例如文本编辑器中的撤销/重做功能或游戏中的人物死亡后的重生点。备忘录模式 提供了一种优雅的方式来处理此类场景。

如何运作

备忘录模式 的工作原理是创建一个称为备忘录 的对象,该对象存储要保存的状态 。当需要保存状态时,我们会创建一个备忘录并将其传递给照顾者 ,后者是一个负责管理备忘录的对象。当需要恢复状态时,我们从照顾者 那里检索备忘录,并将存储的状态复制回原始对象。

优点

  • 轻松撤销和恢复: 使用备忘录模式,撤销或恢复操作只需将备忘录中的状态复制回对象即可。
  • 保存多个状态: 备忘录模式允许保存多个备忘录,以便恢复到不同状态。
  • 解耦对象: 该模式将对象的状态与其行为解耦,简化了对象的测试和维护。

缺点

  • 内存占用: 备忘录模式需要为每个保存的状态创建一个备忘录,这可能占用大量内存。
  • 性能影响: 保存和恢复状态需要额外的操作,这可能会对性能产生影响。

应用场景

备忘录模式 在以下场景中非常有用:

  • 文本编辑器: 保存文本的状态以便进行撤销/重做操作。
  • 游戏: 保存玩家的状态以在死亡后重生。
  • 数据库: 保存数据库的状态以便在发生故障时恢复。

实现示例(Java)

class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public Memento createMemento() {
        return new Memento(state);
    }

    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }
}

class Memento {
    private final String state;

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

    public String getState() {
        return state;
    }
}

class Caretaker {
    private Memento memento;

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

    public Memento getMemento() {
        return memento;
    }
}

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

        // 设置状态并创建备忘录
        originator.setState("State 1");
        caretaker.setMemento(originator.createMemento());

        // 改变状态
        originator.setState("State 2");

        // 恢复状态
        originator.restoreMemento(caretaker.getMemento());

        System.out.println(originator.getState()); // 输出:State 1
    }
}

结论

备忘录模式 是一种有效且灵活的模式,用于保存对象的状态以进行撤销/恢复操作。它提供了一种解耦对象状态与行为的方法,使其更容易管理和维护。

常见问题解答

  1. 备忘录模式与工厂模式有何区别?

    • 工厂模式用于创建对象,而备忘录模式用于保存和恢复对象的状态。
  2. 备忘录模式何时比简单地存储状态更好?

    • 当状态很大、复杂或在对象之间共享时,使用备忘录模式可以防止重复存储相同的状态。
  3. 如何处理备忘录中的循环引用?

    • 备忘录应该只包含对象的状态,而不是引用对象本身。
  4. 备忘录模式与命令模式有何关联?

    • 命令模式可以与备忘录模式结合使用,以保存和恢复命令的状态。
  5. 备忘录模式有性能影响吗?

    • 创建和存储备忘录可能需要一些开销,但与撤销/恢复操作带来的好处相比,通常可以忽略不计。