设计模式-备忘录模式
前言
在Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(16)中介者模式》文章中,我们介绍了中介者模式。本文是这个系列的第十七篇章,我们将讲解一下备忘录模式的实现方式、应用场景以及它的用途。
备忘录模式
备忘录模式是一种行为设计模式,用于保存和恢复对象的状态。通过备忘录模式,可以在不暴露对象内部状态的情况下保存和恢复对象的状态。这种模式通常包括三个角色:发起人(Originator)、备忘录(Memento)、和管理者(Caretaker)。
使用场景
- 需要实现类似“撤销”功能的应用,如文本编辑器、绘图应用
- 需要保存和恢复对象状态的应用,如游戏进度保存
- 需要记录对象状态历史并允许恢复到某个历史状态的系统
代码实现
以下是一个简单的示例。我们将创建一个文本编辑器,其中包含保存和恢复文本状态的功能。
/**
* 文本编辑器
*
* @author Jensen
* @date 2024-07-22
*
*/
public class TextEditor {
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
// 保存备忘录
public Memento save() {
return new Memento(text);
}
// 撤回备忘录
public void restore(Memento memento) {
this.text = memento.getText();
}
}
/**
* 备忘录
*
* @author Jensen
* @date 2024-07-22
*
*/
public class Memento {
private final String text;
public Memento(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
/**
* 备忘录历史
*
* @author Jensen
* @date 2024-07-22
*
*/
public class MementoHistory {
private final List<Memento> mementoList = new ArrayList<>();
public void push(Memento memento) {
mementoList.add(memento);
}
public Memento pop() {
return mementoList.isEmpty() ? null : mementoList.remove(mementoList.size() - 1);
}
public String last() {
StringBuilder str = new StringBuilder();
for (Memento m : mementoList) {
str.append(m.getText());
}
return str.toString();
}
}解释
- 发起人类(TextEditor): setText 和 getText 方法用于设置和获取文本内容。 save 方法创建一个备忘录对象来保存当前状态。 restore 方法从备忘录对象中恢复状态。
- 备忘录类(Memento): Memento 类保存了 TextEditor 的状态(即文本内容),并提供了获取保存状态的方法。 备忘录是不可修改的,并且只能通过 TextEditor 创建和访问。
- 备忘录历史类(MementoHistory): MementoHistory 类负责保存和恢复备忘录对象。可以将备忘录存储在列表中,支持多次恢复。 push 方法保存备忘录,pop 方法恢复到最近保存的状态。
测试
System.out.println("------------------------------备忘录模式-----------------------------");
TextEditor textEditor = new TextEditor();
MementoHistory mementoHistory = new MementoHistory();
// 编辑文本
textEditor.setText("Hello guys!");
System.out.println("已编辑的文本:"+mementoHistory.last()+textEditor.getText());
mementoHistory.push(textEditor.save());
textEditor.setText("I'm a Java !");
System.out.println("已编辑的文本:"+mementoHistory.last()+textEditor.getText());
mementoHistory.push(textEditor.save());
textEditor.setText("welcome to my world!");
System.out.println("已编辑的文本:"+mementoHistory.last()+textEditor.getText());
mementoHistory.push(textEditor.save());
//撤回到上一次操作
textEditor.restore(mementoHistory.pop());
System.out.println("撤回后:"+mementoHistory.last());
textEditor.setText("ok ok---");
System.out.println("已编辑的文本:"+mementoHistory.last()+textEditor.getText());
mementoHistory.push(textEditor.save());输出结果
------------------------------备忘录模式-----------------------------
已编辑的文本:Hello guys!
已编辑的文本:Hello guys!I'm a Java !
已编辑的文本:Hello guys!I'm a Java !welcome to my world!
撤回后:Hello guys!I'm a Java !
已编辑的文本:Hello guys!I'm a Java !ok ok---结语
备忘录模式通过提供保存和恢复对象状态的机制,能够有效地实现状态的撤销和恢复,适用于需要保存历史状态或撤销操作的应用场景。这种模式将状态的保存和恢复操作分离到不同的对象中,避免了直接暴露对象内部状态的风险。