文章摘要: 备忘录模式使用总结。
简介
简要说明
- 备忘录模式(Memento Pattern)是一种行为型设计模式。
- 通过引入一个备忘录对象来捕获并保存一个对象的内部状态,在未来需要时可以恢复到这个状态。
主要功能
- 保存一个对象在某一个时刻的状态,以便在需要时恢复。
- 防止直接访问对象的状态,保持封装性。
注意事项
- 备忘录模式可能会消耗大量资源,尤其是状态较多或者状态数据较大时。
- 确保备忘录对象对发起人对象之外的任何对象都是不可变的,以避免备忘录状态被意外修改。
适用场景
- 当需要保存一个对象的状态快照,并在之后恢复它时。
- 当需要保护对象的完整性时,但又不希望暴露其内部细节。
Java 8
案例
// 发起人角色,拥有需要保存的状态
class Originator {
private String state;
// 设置状态
public void setState(String state) {
this.state = state;
}
// 获取状态
public String getState() {
return state;
}
// 创建备忘录,将当前状态保存到备忘录对象中
public Memento saveStateToMemento() {
return new Memento(state);
}
// 从备忘录对象恢复状态
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
// 备忘录角色,用于存储发起人的内部状态
class Memento {
private final String state;
// 构造函数,保存状态
public Memento(String state) {
this.state = state;
}
// 获取保存的状态
public String getState() {
return state;
}
}
// 管理角色,负责保存和提供备忘录对象
class CareTaker {
private List<Memento> mementoList = new ArrayList<>();
// 添加备忘录到列表
public void add(Memento state) {
mementoList.add(state);
}
// 获取指定索引的备忘录
public Memento get(int index) {
return mementoList.get(index);
}
}
// 客户端代码
public class MementoPatternDemo {
public static void main(String[] args) {
// 创建发起人对象
Originator originator = new Originator();
// 创建备忘录管理对象
CareTaker careTaker = new CareTaker();
// 设置发起人初始状态
originator.setState("State #1");
// 打印当前状态
System.out.println("Current State: " + originator.getState());
// 保存状态到备忘录
careTaker.add(originator.saveStateToMemento());
// 改变状态
originator.setState("State #2");
// 打印当前状态
System.out.println("Current State: " + originator.getState());
// 保存状态到备忘录
careTaker.add(originator.saveStateToMemento());
// 恢复到备忘录的第一个状态
originator.getStateFromMemento(careTaker.get(0));
// 打印恢复后的状态
System.out.println("First saved State: " + originator.getState());
}
}
注释
- 在这个例子中,
Originator类是具有内部状态的类,它提供了方法来保存和恢复状态。 Memento类是备忘录类,它存储了Originator对象的状态。通常,备忘录类会有一个私有构造函数和一个获取状态的方法,以确保其不可变性。CareTaker类是负责管理备忘录的类,它可以保存多个备忘录对象,并提供方法来获取它们。- 在客户端代码
MementoPatternDemo中,我们创建了一个Originator对象和一个CareTaker对象。我们修改了Originator对象的状态,并使用CareTaker对象来保存状态快照。之后,我们通过CareTaker对象恢复到之前保存的状态。这个过程演示了如何使用备忘录模式来保存和恢复对象的状态。