备忘录模式
行为型模式
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。
介绍
意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决: 所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用: 很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。
如何解决: 通过一个备忘录类专门存储对象状态。
关键代码: 客户不与备忘录类耦合,与备忘录管理类耦合。
具体实现
第一步:创建备忘录对象
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 String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
//保存对象状态
public Memento saveStateMemento() {
return new Memento(state);
}
//通过备忘录对象,恢复状态
public void getStateFromMemento(Memento memento){
state = memento.getState();
}
}
第三步:创建集合类来管理多个备忘录对象
public class Caretaker {
private List<Memento> mementos = new ArrayList<>();
public void add(Memento memento) {
mementos.add(memento);
}
public Memento get(int index) {
return mementos.get(index);
}
}
第四步:创建测试类
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.setState("状态①,攻击力为100");
//保存当前状态
caretaker.add(originator.saveStateMemento());
originator.setState("状态②,攻击力为800");
//保存当前状态
caretaker.add(originator.saveStateMemento());
originator.setState("状态③,攻击力为500");
//保存当前状态
caretaker.add(originator.saveStateMemento());
System.out.println("当前状态为:" + originator.getState());
//恢复到状态①
originator.getStateFromMemento(caretaker.get(0));
System.out.println("恢复后当前状态为:" + originator.getState());
}
}
运行如下:
当前状态为:状态③,攻击力为500
恢复后当前状态为:状态①,攻击力为100
优点:
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。