概念
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存该状态。这样就可以价格该对象恢复到原先保存的状态。
备忘录模式需要三个角色:发起人、备忘录、管理者。当发起人想要储存内部状态时,可以根据当前状态创建一个备忘录对象;或者从管理者维护的备忘录对象读取保存的状态。备忘录对象负责储存发起人的状态。管理者负责维护备忘录对象,不能读取备忘录中存储的状态。
代码
发起人
package com.voice.thread.pattern.memo;
public class Originator {
// 对象的内部状态
private String state;
public Originator() {
}
public Originator(String state) {
this.state = state;
}
public void setState(String state) {
this.state = state;
}
// 根据当前状态创建备忘录对象
public Memento createMemeto (){
return new Memento(state);
}
// 读取备忘录中存储的对象
public void getSavedState(Memento memento){
this.state = memento.getState();
}
public void show(){
System.out.println("当前状态:"+state);
}
}
备忘录
public class Memento {
private String state;
// 根据发起人传入的对象,创建备忘录对象
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
管理者类
public class Caretaker {
private Memento memento;
// 返回备忘录对象
public Memento getMemento() {
return memento;
}
// 获取备忘录对象
public void setMemento(Memento memento) {
this.memento = memento;
}
}
客户端程序
public class Client {
public static void main(String[] args) {
//
Originator originator = new Originator();
originator.setState("战斗前状态");
Caretaker caretaker = new Caretaker();
caretaker.setMemento(originator.createMemeto());
System.out.println("保存状态");
originator.show();
System.out.println("战斗失败,读取状态");
// 战斗失败,读取备份前的状态
originator.getSavedState(caretaker.getMemento());
originator.show();
}
}
// 保存状态
// 当前状态:战斗前状态
// 战斗失败,读取状态
// 当前状态:战斗前状态
疑惑
能否通过在备忘录对象里使用栈或者list等其他集合,实现多存档读取?