设计模式:备忘录模式

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

相关推荐
哪 吒1 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10221 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
转世成为计算机大神4 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术5 小时前
23种设计模式速记法
设计模式
小白不太白9507 小时前
设计模式之 外观模式
microsoft·设计模式·外观模式
小白不太白9507 小时前
设计模式之 原型模式
设计模式·原型模式
澄澈i7 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
小白不太白95014 小时前
设计模式之建造者模式
java·设计模式·建造者模式
菜菜-plus16 小时前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大16 小时前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式