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、总结
备忘录模式的优点包括:
- 它可以保存和恢复对象的状态,而无需破坏其封装性。
- 它可以简化原发器的代码,将状态管理交给负责人对象。
- 它提供了灵活性,使得可以随时保存和恢复对象的不同状态。
然而,备忘录模式也有一些注意事项:
- 备忘录对象可能会消耗较大的内存,特别是在保存大量状态时。
- 备忘录对象通常只由原发器访问,因此其他对象无法直接访问或修改备忘录中的状态。