学习目标:
- 了解备忘录模式
学习内容:
备忘录模式在现实生活中的一个具体例子是文字处理软件(如Microsoft Word)中的“撤销”功能。这个功能允许用户在编辑文档时撤销之前的操作,并恢复到之前的状态。让我们更详细地看一下如何用备忘录模式实现这个功能。
文字处理软件中的“撤销”功能
假设你在使用文字处理软件编写一篇文章。你可能会进行多次编辑操作,例如添加文本、删除文本和修改格式。软件会在每次操作后保存文档的当前状态,使你能够撤销任何不需要的操作,并恢复到之前的状态。
备忘录模式的应用
发起人(Originator):代表文档对象。它可以创建一个备忘录对象来保存当前文档的状态,并可以从备忘录对象恢复到之前的状态。
备忘录(Memento):存储文档的状态,例如文本内容和格式。
负责人(Caretaker):管理备忘录对象的列表,以便可以保存和恢复文档的状态。
代码实现
// 备忘录类
public class Memento {private String content;public Memento(String content) {this.content = content;}public String getContent() {return content;}
}// 发起人类
public class Document {private String content;public void setContent(String content) {this.content = content;}public String getContent() {return content;}public Memento saveToMemento() {return new Memento(content);}public void restoreFromMemento(Memento memento) {content = memento.getContent();}
}// 负责人类
import java.util.Stack;public class Caretaker {private Stack<Memento> mementoStack = new Stack<>();public void saveMemento(Memento memento) {mementoStack.push(memento);}public Memento undo() {if (!mementoStack.isEmpty()) {return mementoStack.pop();}return null;}
}// 客户端代码
public class TextEditor {public static void main(String[] args) {Document document = new Document();Caretaker caretaker = new Caretaker();// 初始内容document.setContent("First version");System.out.println("Content: " + document.getContent());// 保存状态caretaker.saveMemento(document.saveToMemento());// 修改内容document.setContent("Second version");System.out.println("Content: " + document.getContent());// 保存状态caretaker.saveMemento(document.saveToMemento());// 进一步修改内容document.setContent("Third version");System.out.println("Content: " + document.getContent());// 执行撤销操作document.restoreFromMemento(caretaker.undo());System.out.println("After undo: " + document.getContent());// 再次执行撤销操作document.restoreFromMemento(caretaker.undo());System.out.println("After second undo: " + document.getContent());}
}
解释
- 备忘录类(Memento):存储文档的状态,这里是文档的内容。
- 发起人类(Document):负责创建备忘录对象以保存当前状态,并从备忘录对象中恢复状态。
- 负责人类(Caretaker):管理保存的备忘录对象,提供撤销功能。
在这个例子中,用户可以进行多次编辑,每次编辑后保存当前状态到备忘录中。如果用户需要撤销某个编辑操作,只需从负责人(Caretaker)中获取之前保存的状态,并恢复到该状态。这样,文档对象就能够恢复到之前的状态,实现了撤销功能。