设计模式:备忘录模式

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

模式的主要参与者包括:

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

应用场景:

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

优点:

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

缺点:

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

示例代码(Java):

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

1. 状态类(TextState)
public class TextState {
    private String content;

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

    public String getContent() {
        return content;
    }
}
2. 发起人类(TextEditor - Originator)
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)
public class TextMemento {
    private final TextState state;

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

    public TextState getState() {
        return state;
    }
}
4. 管理者类(Caretaker - 可选,在此示例中未单独实现,直接在客户端代码中使用)
5. 客户端代码
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对象。客户端代码中,我们创建了一个文本编辑器实例,输入了一些文本,保存了一个状态,继续输入后模拟了撤销操作,恢复到了之前保存的状态。这展示了备忘录模式如何帮助我们实现状态的保存和恢复功能。

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下捕获并保存一个对象的内部状态,并在需要时恢复该状态。在软件开发中,备忘录模式通常用于实现撤销操作或者历史记录功能。 下面是一个使用备忘录模式的简单示例,假设我们有一个文本编辑器,用户可以在其中输入文本并进行编辑操作。我们希望实现一个撤销功能,使得用户可以撤销之前的编辑操作。 首先,我们需要定义一个备忘录类,用于保存编辑器的状态: ```python class EditorMemento: def __init__(self, content): self.content = content def get_content(self): return self.content ``` 然后,我们需要定义一个编辑器类,其中包含了一些编辑操作,以及用于保存和恢复状态的方法: ```python class Editor: def __init__(self): self.content = "" def type(self, words): self.content = self.content + " " + words def delete(self, words): if words in self.content: self.content = self.content.replace(words, "") def save(self): return EditorMemento(self.content) def restore(self, memento): self.content = memento.get_content() ``` 最后,我们可以使用这个编辑器类来实现撤销功能: ```python editor = Editor() editor.type("This is the first sentence.") editor.type("This is the second sentence.") saved = editor.save() editor.delete("second") print(editor.content) # 输出:This is the first sentence. editor.restore(saved) print(editor.content) # 输出:This is the first sentence. This is the second sentence. ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值