1、备忘录模式的学习
当您需要在不破坏封装性的前提下保存和恢复对象的状态时,备忘录模式是一种有用的设计模式。备忘录模式允许您将对象的状态保存到备忘录对象中,并在需要时从备忘录中恢复状态。这种模式分离了状态的保存和恢复逻辑,使得对象的状态管理更加灵活和可扩展
备忘录模式包含以下几个关键角色:
- Originator(原发器):原发器是要保存和恢复状态的对象。它可以创建备忘录对象来保存其内部状态,并从备忘录对象中恢复状态。
- Memento(备忘录):备忘录通常具有与原发器相对应的属性,并可以通过原发器访问其内部状态。
- Caretaker(负责人):负责人对象负责保存和管理备忘录对象。它可以将备忘录传递给原发器以进行状态的恢复,或者将备忘录存档以供以后使用。
备忘录模式的工作流程如下:
- 原发器创建一个备忘录对象,并将自己的状态存储在备忘录中。
- 原发器可以使用备忘录对象来保存其内部状态。
- 在需要时,原发器可以从备忘录中恢复其状态。
- 负责人对象可以保存多个备忘录对象,并负责管理它们的存储和恢复。
2、备忘录模式的使用
假设你正在开发一个文本编辑器应用程序。你需要实现一个撤销(undo)功能,使用户能够撤销对文本的修改操作。你可以使用备忘录模式来实现这个功能。
备忘录
public class TextMemento {
private String value;
public TextMemento(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
原发器
public class TextOriginator {
private TextMemento textMemento;
public void setTextMemento(String value) {
if (Objects.isNull(textMemento)) {
this.textMemento = new TextMemento(value);
} else {
this.textMemento.setValue(value);
}
}
public void restoreTextMemento(TextMemento textMemento) {
this.textMemento.setValue(textMemento.getValue());
}
public TextMemento createTextMemento() {
return new TextMemento(this.textMemento.getValue());
}
public TextMemento getTextMento() {
return textMemento;
}
}
负责人
public class TextCaretaker {
private List<TextMemento> textMementoList = new ArrayList<>();
public Integer addTextMemento(TextMemento textMemento) {
textMementoList.add(textMemento);
return textMementoList.size();
}
public TextMemento getTextMento(int index) {
if (index < textMementoList.size()) {
return textMementoList.get(index);
}
return null;
}
}
客户端
public class TextMementoClient {
public static void main(String[] args) {
TextCaretaker textCaretaker = new TextCaretaker();
TextOriginator textOriginator = new TextOriginator();
textOriginator.setTextMemento("状态1");
textCaretaker.addTextMemento(textOriginator.createTextMemento());
textOriginator.setTextMemento("状态2");
textCaretaker.addTextMemento(textOriginator.createTextMemento());
textOriginator.setTextMemento("状态3");
textCaretaker.addTextMemento(textOriginator.createTextMemento());
System.out.println(textOriginator.getTextMento().getValue());
textOriginator.restoreTextMemento(textCaretaker.getTextMento(0));
System.out.println(textOriginator.getTextMento().getValue());
}
}
状态3
状态1
3、总结
备忘录模式的优点包括:
- 它可以保存和恢复对象的状态,而无需破坏其封装性。
- 它可以简化原发器的代码,将状态管理交给负责人对象。
- 它提供了灵活性,使得可以随时保存和恢复对象的不同状态。
然而,备忘录模式也有一些注意事项:
- 备忘录对象可能会消耗较大的内存,特别是在保存大量状态时。
- 备忘录对象通常只由原发器访问,因此其他对象无法直接访问或修改备忘录中的状态。