备忘录模式定义
- ①:备忘录模式,是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
- ②:备忘录模式属于行为型模式。
- ③:给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
备忘录模式类图
Originator:原始对象Caretaker:负责保存好备忘录Memento:备忘录,存储原始对象的状态。
备忘录实际上有两个接口:- ①:一个是提供给
Caretaker的窄接口:它只能将备忘录传递给其它对象; - ②:一个是提供给
Originator的宽接口,允许它访问到先前状态所需的所有数据。理想情况是只允许Originator访问本备忘录的内部状态。
- ①:一个是提供给

Originator创建并在Memento对象中存储状态:
/*`Originator`创建并在`Memento`对象中存储状态*/public class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}/*保存`Originator`的状态到`Memento`*/public Memento saveStateToMemento() {return new Memento(state);}/*`Originator`从`Memento`获取之前保存的状态,并进行回滚*/public void recoveryStateFromMemento(Memento Memento) {state = Memento.getState();}}
Memento包含了要被恢复的Originator状态:
/*`Memento`包含了要被恢复的`Originator`状态*/public class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}}
Caretaker负责保存Memento,是一个仓库:
/*`Caretaker`负责保存`Memento`,是一个仓库*/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) {CareTaker careTaker = new CareTaker();Originator originator = new Originator();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.recoveryStateFromMemento(careTaker.get(0)); /*恢复之前指定的具体某个状态*/System.out.println("First saved State: " + originator.getState());originator.recoveryStateFromMemento(careTaker.get(1)); /*恢复之前指定的具体某个状态*/System.out.println("Second saved State: " + originator.getState());}}
输出内容如下:
Current State: State #4First saved State: State #2Second saved State: State #3
