Appearance
备忘录模式
1. 定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
优点
- 提供了一种可以恢复状态的机制,实现状态的封装,使得用户不需要关心状态的保存细节。
- 简化了发起人角色,不需要管理和保存其内部状态的各个备份,所有状态恢复操作由备忘录角色负责。
缺点
- 资源消耗大,如果内部状态信息很多,每一次保存都会消耗大量的内存。
使用场景
- 需要保存与恢复原始状态的场景,如文本编辑器、撤销操作等。
- 需要提供对象状态的回滚操作,如事务管理、游戏存档等。
代码示例
java
public class Memento {
private final Tower tower;
public Memento(Tower tower) {
this.tower = tower;
}
public Tower getTower() {
return tower;
}
}
java
public class Tower {
private String name;
public Tower(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
java
public class TowerPedestal {
private Tower tower;
public TowerPedestal() {
}
public Tower getTower() {
return tower;
}
public void setTower(Tower tower) {
this.tower = tower;
}
public Memento createMemento() {
return new Memento(tower);
}
public void restoreMemento(Memento memento) {
// 恢复备忘录中的塔状态
this.tower = memento.getTower();
}
}
java
public class Caretaker {
//可以有多个备忘录
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
java
public class Client {
public static void main(String[] args) {
TowerPedestal towerPedestal = new TowerPedestal();
Caretaker caretaker = new Caretaker();
Tower tower = new Tower("箭塔");
Tower tower1 = new Tower("炮塔");
towerPedestal.setTower(tower);
System.out.printf("塔基上塔类型是:%s\n", towerPedestal.getTower().getName());
caretaker.setMemento(towerPedestal.createMemento());
towerPedestal.setTower(tower1);
System.out.printf("塔基上塔类型是:%s\n", towerPedestal.getTower().getName());
towerPedestal.restoreMemento(caretaker.getMemento());
System.out.printf("塔基上塔类型是:%s\n", towerPedestal.getTower().getName());
}
}
运行结果:
txt
塔基上塔类型是:箭塔
塔基上塔类型是:炮塔
塔基上塔类型是:箭塔