备忘录模式概述

备忘录模式(Memento Pattern)是一种行为设计模式,允许在不破坏封装性的前提下捕获并外部化对象的内部状态,以便后续恢复。该模式由三个核心角色组成:

  • Originator(发起人):需要保存状态的对象。
  • Memento(备忘录):存储Originator内部状态的对象。
  • Caretaker(管理者):负责保存和恢复备忘录。

核心实现步骤

定义备忘录类(Memento)
备忘录类用于存储Originator的内部状态,通常通过构造函数或方法接收状态数据,并提供获取状态的接口。

public class Memento {
    private final String state;

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

    public String getState() {
        return state;
    }
}

定义发起人类(Originator)
Originator类包含需要保存的状态,并提供创建备忘录和从备忘录恢复状态的方法。

public class Originator {
    private String state;

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

    public String getState() {
        return state;
    }

    // 创建备忘录
    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    // 从备忘录恢复
    public void restoreStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

定义管理者类(Caretaker)
Caretaker负责保存和管理备忘录对象,但不直接操作备忘录内容。

import java.util.ArrayList;
import java.util.List;

public class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();

    public void addMemento(Memento memento) {
        mementoList.add(memento);
    }

    public Memento getMemento(int index) {
        return mementoList.get(index);
    }
}

使用示例

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

        originator.setState("State #1");
        caretaker.addMemento(originator.saveStateToMemento());

        originator.setState("State #2");
        caretaker.addMemento(originator.saveStateToMemento());

        // 恢复到第一个状态
        originator.restoreStateFromMemento(caretaker.getMemento(0));
        System.out.println("Restored State: " + originator.getState());
    }
}

应用场景

  1. 撤销/重做功能:如文本编辑器保存历史状态。
  2. 游戏存档:保存游戏进度以便恢复。
  3. 事务回滚:数据库操作失败时恢复原始状态。

注意事项

  • 封装性保护:备忘录不应暴露Originator的实现细节,通常将Memento设为Originator的内部类。
  • 性能开销:频繁保存状态可能导致内存占用过高,需权衡存储频率。

通过备忘录模式,可以灵活管理对象状态的历史记录,同时保持代码的清晰性和可维护性。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐