
问题
memento 模式解决了在不违反对象封装的情况下捕获和恢复对象内部状态的需求。这在您想要实现撤消/重做功能、允许对象恢复到之前状态的场景中非常有用。
解决方案
memento 模式涉及三个主要组成部分:
- originator: 需要保存和恢复内部状态的对象。
- memento: 存储发起者内部状态的对象。纪念品是一成不变的。
- caretaker: 负责请求发起者从备忘录中保存或恢复其状态。
发起者创建一个包含其当前状态快照的备忘录。然后,管理员可以存储该备忘录,并在需要时用于恢复发起者的状态。
优点和缺点
优点
- 保留封装:允许保存和恢复对象的内部状态而不暴露其实现细节。
- 简单的撤消/重做: 方便实现撤消/重做功能,使系统更加健壮和用户友好。
- 状态历史记录: 允许维护对象先前状态的历史记录,从而实现不同状态之间的导航。
缺点
- 内存消耗:存储多个备忘录会消耗大量内存,特别是当对象的状态很大时。
- 额外的复杂性: 给代码带来了额外的复杂性,需要管理纪念品的创建和恢复。
- 看护者责任: 看护者需要有效地管理纪念品,这会增加系统的责任和复杂性。
实际应用示例
memento 模式的一个实际示例是提供撤消/重做功能的文本编辑器。对文档的每次更改都可以保存为备忘录,允许用户根据需要恢复到文档之前的状态。
模板采用响应式设计,自动适应手机,电脑及平板显示;满足单一店铺外卖需求。功能:1.菜单分类管理2.菜品管理:菜品增加,删除,修改3.订单管理4.友情链接管理5.数据库备份6.文章模块:如:促销活动,帮助中心7.单页模块:如:企业信息,关于我们更强大的功能在开发中……安装方法:上传到网站根目录,运行http://www.***.com/install 自动
立即学习“Java免费学习笔记(深入)”;
java 中的示例代码
代码中的备忘录模式:
// Originator
public class Editor {
private String content;
public void setContent(String content) {
this.content = content;
}
public String getContent() {
return content;
}
public Memento save() {
return new Memento(content);
}
public void restore(Memento memento) {
content = memento.getContent();
}
// Memento
public static class Memento {
private final String content;
public Memento(String content) {
this.content = content;
}
private String getContent() {
return content;
}
}
}
// Caretaker
public class History {
private final Stack history = new Stack<>();
public void save(Editor editor) {
history.push(editor.save());
}
public void undo(Editor editor) {
if (!history.isEmpty()) {
editor.restore(history.pop());
}
}
}
// Client code
public class Client {
public static void main(String[] args) {
Editor editor = new Editor();
History history = new History();
editor.setContent("Version 1");
history.save(editor);
System.out.println(editor.getContent());
editor.setContent("Version 2");
history.save(editor);
System.out.println(editor.getContent());
editor.setContent("Version 3");
System.out.println(editor.getContent());
history.undo(editor);
System.out.println(editor.getContent());
history.undo(editor);
System.out.println(editor.getContent());
}
}









