原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。
备忘录模式用于备份对象的部分内部状态,在需要的时候,将对象状态恢复到原来的样子。
举个例子
假设日常玩儿游戏的时候,希望自己的角色在打个大boss的时候先保存一下角色状态,如果打boss失败则恢复到原来的状态,以便重新开始。这个时候我们可以考虑使用备忘录模式。
来看一下UML
图 :
看一下具体代码实现
先创建一个备忘录,用于记录需要记录的状态。
public class Memento {
//需要保存的状态,可以是多个
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){
return state;
}
}
复制代码
定义一个游戏角色,在该角色内部创建备忘录,并将相应状态保存至备忘录。
public class GameRole {
//游戏状态
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = 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 memento){
mementoList.add(memento);
}
public Memento get(int index){
return mementoList.get(index);
}
}
复制代码
客户端这样使用
public class MementoPatternDemo {
public static void main(String[] args){
GameRole gameRole = new GameRole();
CareTaker careTaker = new CareTaker();
gameRole.setState("State #1");
gameRole.setState("State #2");
careTaker.add(gameRole.saveStateToMemento());
gameRole.setState("State #3");
careTaker.add(gameRole.saveStateToMemento());
gameRole.setState("State #4");
System.out.println("Current State: " + gameRole.getState());
gameRole.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + gameRole.getState());
gameRole.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + gameRole.getState());
}
}
复制代码
总结
备忘录模式是行为模式之一,比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者众多属性中的一小部分。也是日常使用频率比较高的一种设计模式。