备忘录模式
目的
在不违反封装的情况下获得对象的内部状态,在需要时可以将对象恢复到最初状态。
类图
角色
- Originator: 原始对象,发起人。
- Caretaker: 管理角色,负责保存好备忘录。
- Menento: 备忘录,负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
实现
这个就像打游戏时的存档独档机制,或者说 Ctrl + Z。
备忘录
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){
return state;
}
}
原始对象
public 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();
}
}
管理角色
public 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);
}
}
调用类
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
优缺点
优点
- 给用户提供了可以恢复状态的机制,可以使用户能够较方便地回到某个历史的状态。
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点
- 消耗资源。如果类成员变量过多,势必会占用较大的资源,而且每一次保存都会消耗一定的内存。
使用场景
- 需要保存/恢复数据的相关状态场景。
- 提供一个可回滚的操作。
JDK中的使用
- java.io.Serializable