欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 备忘录模式

备忘录模式

2025/4/19 17:44:24 来源:https://blog.csdn.net/m0_61787196/article/details/145068154  浏览:    关键词:备忘录模式

备忘录模式(Memento Pattern),是一种行为型设计模式。它用于在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。备忘录模式非常适合用于实现撤销功能、事务处理或历史记录等功能,使得系统能够在发生错误或需要回滚时恢复到之前的状态。

备忘录模式的特点

  1. 保持封装性:即使状态是私有的,也可以通过备忘录对象来存储和恢复这些状态。
  2. 支持多级撤销:可以保存多个历史状态,从而支持多次撤销操作。
  3. 简化了发起人:发起人只需关注如何创建和使用备忘录,而不需要关心具体的保存机制。
  4. 符合开闭原则:可以在不修改现有代码的情况下添加新的状态保存逻辑。
  5. 提高灵活性:允许不同的组件以不同方式保存和管理状态,增加了系统的灵活性。

备忘录模式的组成

  • Originator(发起人):负责创建包含自身内部状态的备忘录对象,同时也能够使用备忘录对象恢复其内部状态。发起人知道如何保存自己的状态,但并不直接暴露这些状态给其他对象。
  • Memento(备忘录):用于存储发起人的内部状态。它有两个接口:窄接口(Caretaker可见)只允许访问基本信息;宽接口(Originator可见)则提供了完整的状态访问权限。
  • Caretaker(管理者):负责保存和管理备忘录对象,但它不能对备忘录的内容进行操作或检查。管理者只知道何时保存以及何时恢复备忘录。

备忘录模式的实现

我们将通过一个简单的例子来演示备忘录模式的应用:假设我们正在开发一个文本编辑器,用户可以输入文本并执行撤销操作以回到之前的版本。我们可以使用备忘录模式来实现这一需求,确保用户能够随时撤回他们所做的更改。

示例代码

// 发起人 - TextEditor
class TextEditor {private String content;public void setContent(String content) {this.content = content;System.out.println("Content set to: " + content);}public String getContent() {return content;}// 创建备忘录public Memento createMemento() {System.out.println("Creating memento.");return new Memento(content);}// 使用备忘录恢复状态public void restoreFromMemento(Memento memento) {System.out.println("Restoring from memento.");this.content = memento.getContent();}
}// 备忘录 - Memento
class Memento {private final String content;public Memento(String content) {this.content = content;}// 宽接口,仅对发起人可见public String getContent() {return content;}
}// 管理者 - Caretaker
class Caretaker {private Memento memento;public void saveMemento(Memento memento) {this.memento = memento;}public Memento retrieveMemento() {return memento;}
}

使用示例

public class MementoPatternDemo {public static void main(String[] args) {// 创建发起人和管理者TextEditor editor = new TextEditor();Caretaker caretaker = new Caretaker();// 模拟编辑过程editor.setContent("First version");caretaker.saveMemento(editor.createMemento());editor.setContent("Second version");caretaker.saveMemento(editor.createMemento());editor.setContent("Third version");// 撤销到最后一次保存的状态System.out.println("\nUndoing to last saved state...");editor.restoreFromMemento(caretaker.retrieveMemento());System.out.println("Current content: " + editor.getContent());// 再次撤销System.out.println("\nUndoing to the first saved state...");caretaker.saveMemento(editor.createMemento()); // 保存当前状态为新的备忘录editor.restoreFromMemento(caretaker.retrieveMemento());System.out.println("Current content: " + editor.getContent());}
}

备忘录模式的应用场景

  • 当你需要保存一个对象的某些状态,以便将来可能恢复到这些状态时。
  • 如果希望提供撤销功能,如文本编辑器中的撤销命令。
  • 在实现事务处理时,备忘录模式可以帮助你记录事务开始前的状态,以便在事务失败时进行回滚。
  • 对于那些具有复杂状态的对象,备忘录模式可以有效地管理和恢复这些状态,而不必暴露内部结构。
  • 支持多级别的撤销/重做功能,即可以逐步地撤销或重新执行一系列操作。

结语

希望本文能帮助您更好地理解备忘录模式的概念及其实际应用。如果您有任何疑问或建议,请随时留言交流。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com