设计模式 - 浅谈备忘录模式
备忘录模式
模式功能说明:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。
模式思路与原理
备忘录模式涉及三种角色:
- 发起人(Originator):负责创建一个备忘录,用以记录当前内部状态,通过也可以使用备忘录恢复内部状态。
- 备忘录(Memento):负责存储发起人的内部状态,并可以防止发起人以外的其他对象访问备忘录。
- 管理者(Caretaker):负责保存备忘录,不能对备忘录的内容进行操作或检查。
代码示例
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
class Originator {
private String state;
public void setState(String state) {
this.state = state;
}
public Memento saveStateToMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
}
class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state) {
mementoList.add(state);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
Originator
类可以创建一个备忘录,保存其当前状态,也可以使用备忘录恢复其内部状态。Memento
类是一个备忘录,可以存储Originator
的内部状态。CareTaker
类可以保存备忘录,但不能对备忘录的内容进行操作。
使用场景:
- 当需要保存一个对象在某一个时刻的状态或者备份一个对象的状态,以便在需要的时候恢复它。
优缺点
优点:
- 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
- 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
- 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
缺点:
- 如果需要保存的状态数据过多,将会消耗大量的存储空间。
- 可能需要对备忘录进行深拷贝,以防原始对象变化时备忘录也随之变化。
总结
备忘录模式遵循了封装性原则,即外部对象不应该知道备忘录对象的实现细节。 备忘录模式是一种行为设计模式,主要用于保存和恢复对象的内部状态。它可以帮助我们实现撤销、回滚等操作,但需要注意的是,如果状态数据过多,将会消耗大量的存储空间。