备忘录应用场景明确并且有限,一般用来数据的防丢失、撤销和恢复。对大对象的备份和恢复,备忘录模式能有效的节省时间和空间开销。
备忘录模式:也称为快照模式,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态以便后续能将这个对象恢复成之前的状态。
备忘录模式的两个要点
使用记事本程序来理解各个角色
/**
* 简单的文本编辑器
*
* @author Jean
* @date 2024/06/07
*/
class InputText {
private StringBuilder text = new StringBuilder();
public String getText() {
return text.toString();
}
public void append(String input) {
text.append(input);
}
public void setText(String text) {
this.text.replace(0, this.text.length(), text);
}
}
/**
* 保存并处理快照
*
* @author Jean
* @date 2024/06/07
*/
public class SnapshotHolder {
private Stack<InputText> snapshots = new Stack<>();
public InputText popSnapshot() {
return snapshots.pop();
}
public void pushSnapshot(InputText inputText) {
InputText deepClonedInputText = new InputText();
deepClonedInputText.setText(inputText.getText());
snapshots.push(deepClonedInputText);
}
}
问题:
//定义一个文本编辑器,能保存编辑的文本
//原发器(Originator) 负责创建一个备忘录,用以存储其当前状态;同时也可以利用备忘录恢复其内部状态。
class InputText{
private StringBuilder text = new StringBuilder();
public String getText(){
return text.toString();
}
public void append(String input){
text.append(input);
}
}
//备忘录角色
//用于存储原发器对象的内部状态。为了保护原发器对象的封装性,备忘录对象通常被设计为不可直接访问其内容,只暴露给原发器。
class SnapShot{
private String text;
public SnapShot(String text) {
this.text = text;
}
public String getText() {
return text;
}
}
//负责人 caretaker
//负责保管备忘录对象,但不直接读取或修改备忘录的内容。它只是简单的提供一个存储空间,用来在需要的时候传递给原发器。
public class SnapshotHolder{
private Stack<SnapShot> snapShots=new Stack<>();
public SnapShot popSnapshot(){
return snapShots.pop();
}
public void PushSnapshot(SnapShot snapShot){
snapShots.push(snapShot);
}
}
备忘录模式适合的场景如下:
备忘录模式在实现时,设计者需要权衡状态保存的频率和成本,以确保不会因为过度使用而导致资源紧张。此外,也可以考虑对备忘录进行优化,比如限制保存的状态数量,或者采用更为高效的序列化技术来减少存储开销。