设计模式:备忘录模式

**备忘录模式(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对象。客户端代码中,我们创建了一个文本编辑器实例,输入了一些文本,保存了一个状态,继续输入后模拟了撤销操作,恢复到了之前保存的状态。这展示了备忘录模式如何帮助我们实现状态的保存和恢复功能。

相关推荐
wu~9709 小时前
手撕四种常用设计模式(工厂,策略,代理,单例)
java·单例模式·设计模式·代理模式·抽象工厂模式·策略模式
敲代码的 蜡笔小新15 小时前
【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀
unity·设计模式·c#·访问者模式
软考真题app1 天前
软件设计师考试结构型设计模式考点全解析
设计模式·软件设计师·结构型设计模式·考试考点
xiaolin03331 天前
【设计模式】- 行为型模式1
设计模式·状态模式·责任链模式·策略模式·命令模式·模板方法模式·行为型模式
沐土Arvin1 天前
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
开发语言·前端·javascript·设计模式·html
bao_lanlan1 天前
兰亭妙微:用系统化思维重构智能座舱 UI 体验
ui·设计模式·信息可视化·人机交互·交互·ux·外观模式
总是难免2 天前
设计模式 - 单例模式 - Tips
java·单例模式·设计模式
Java致死2 天前
设计模式Java
java·开发语言·设计模式
ghost1432 天前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
敲代码的 蜡笔小新2 天前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式