设计模式:备忘录模式

**备忘录模式(Memento Pattern)**是一种行为设计模式,它的主要目的是在不破坏对象的封装性的前提下,捕获并存储一个对象的内部状态,以便在将来需要时恢复该对象到之前的状态。这种模式非常适合需要实现撤销操作或状态恢复的场景,比如文本编辑器的撤销功能、游戏中的存档与读档功能等。

模式的主要参与者包括:

  • Originator(发起人):创建并维护内部状态的对象,它定义了哪些状态需要被保存在备忘录中,同时提供了创建和恢复备忘录的方法。
  • Memento(备忘录):用于存储Originator对象的内部状态。备忘录类通常会有两个接口,一个窄接口供发起人以外的类访问(只暴露有限的信息,保持封装性),另一个宽接口供发起人访问(可以访问所有保存的信息,以便恢复状态)。
  • Caretaker(管理者/守护者):不直接访问备忘录的内容,只是负责存储和提供备忘录。它不关心备忘录的具体内容,只负责传递备忘录对象。

应用场景:

  1. 需要提供"撤销/重做"功能的场合,如文本编辑器、图形编辑软件。
  2. 需要保存和恢复状态的场景,如游戏进度保存和加载。
  3. 任何需要维护对象历史状态,以便在需要时可以恢复到过去状态的情况

优点:

  • 提高灵活性:对象可以在不影响其正常职责的情况下,将状态恢复到历史状态。
  • 简化原对象:原对象不需要关心状态的存储细节,这些被转移到备忘录对象中处理。
  • 封装性:备忘录对象存储了发起人的内部状态,但是限制了外界对这些状态的直接访问,只暴露有限的必要接口。

缺点:

  • 资源消耗:如果需要保存的状态较为复杂或频繁,可能会占用较多的存储空间。
  • 设计复杂度增加:引入了更多的类和对象,增加了系统的复杂性。

示例代码(Java):

以下是使用Java语言实现备忘录模式的一个简单示例。在这个例子中,我们定义了一个简单的文本编辑器TextEditor作为发起人(Originator),它能够保存和恢复文本状态。TextState代表文本的状态信息,而TextMemento则作为备忘录,用于存储和恢复TextEditor的状态。

1. 状态类(TextState)
java 复制代码
public class TextState {
    private String content;

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

    public String getContent() {
        return content;
    }
}
2. 发起人类(TextEditor - Originator)
java 复制代码
public class TextEditor {
    private TextState currentState;

    public void type(String text) {
        System.out.println("Typing: " + text);
        currentState = new TextState(currentState != null ? currentState.getContent() + text : text);
    }

    public TextMemento save() {
        return new TextMemento(currentState);
    }

    public void restore(TextMemento memento) {
        currentState = memento.getState();
        System.out.println("Restored state to: " + currentState.getContent());
    }
}
3. 备忘录类(TextMemento)
java 复制代码
public class TextMemento {
    private final TextState state;

    public TextMemento(TextState state) {
        this.state = state;
    }

    public TextState getState() {
        return state;
    }
}
4. 管理者类(Caretaker - 可选,在此示例中未单独实现,直接在客户端代码中使用)
5. 客户端代码
java 复制代码
public class MementoPatternDemo {
    public static void main(String[] args) {
        TextEditor editor = new TextEditor();
        
        editor.type("Hello, ");
        TextMemento memento1 = editor.save();
        
        editor.type("how are you?");
        System.out.println("Current text: " + editor.currentState.getContent());
        
        // 模拟撤销操作
        editor.restore(memento1);
    }
}

在这个示例中,TextEditor作为发起人,负责创建和恢复文本的状态;TextState是内部状态类,保存文本的具体内容;TextMemento作为备忘录,用于存储某个时刻的TextState对象。客户端代码中,我们创建了一个文本编辑器实例,输入了一些文本,保存了一个状态,继续输入后模拟了撤销操作,恢复到了之前保存的状态。这展示了备忘录模式如何帮助我们实现状态的保存和恢复功能。

相关推荐
明戈戈7 小时前
设计模式-模板方法模式
设计模式·模板方法模式
python资深爱好者7 小时前
在什么情况下你会使用设计模式
设计模式
PingCAP12 小时前
Dify + TiDB Vector,快速构建你的AI Agent
数据库·人工智能·设计模式
BoldExplorer12 小时前
设计模式(四)责任链模式
设计模式·责任链模式
GIS_JH13 小时前
设计模式简单示例
设计模式
搬砖的小熊猫14 小时前
设计模式探索:策略模式
设计模式·策略模式
桦说编程17 小时前
深入理解 Future, CompletableFuture, ListenableFuture,回调机制
java·后端·设计模式
spell00719 小时前
设计模式之代理模式
设计模式·代理模式
客院载论19 小时前
秋招突击——设计模式补充——简单工厂模式和策略模式
设计模式
lazy★boy20 小时前
策略模式的应用
设计模式·策略模式