设计模式的学习(十四):备忘录模式
备忘录模式
1、备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。备忘录模式属于行为型模式。
2、例子
比如我们完单机游戏时的存档,今天通关不了先存档,等明天有时间了再来接着打,这样就很美滋滋。也比如浏览器中的后退、数据库中的事务管理。
3、备忘录模式的优缺点
优点:
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存
4、代码
public class EntryptTest {
public static void main(String[] args) throws Exception {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("游戏开始!");
System.out.println(originator.getState());
originator.setState("游戏暂停!");
careTaker.add(originator.saveStateByMemento());
System.out.println("有事情要出去:" + originator.getState());
originator.setState("游戏结束!");
careTaker.add(originator.saveStateByMemento());
System.out.println(originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("回来了,回到暂停处开始:" + originator.getState());
}
}
//创建一个 Memento 类使得客户端不能直接操作它
class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
//创建一个 Originator 类,来进行操作Memento
class Originator {
private String state;
public Memento saveStateByMemento() {
return new Memento(state);
}
public void getStateFromMemento(Memento memento) {
state = memento.getState();
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
// 创建一个 CareTaker 来进行管理 Memento
class CareTaker {
private List<Memento> mementoList = new ArrayList<>();
public void add(Memento memento) {
mementoList.add(memento);
}
public Memento get(int index) {
return mementoList.get(index);
}
}
运行结果:
游戏开始!
有事情要出去:游戏暂停!
游戏结束!
回来了,回到暂停处开始:游戏暂停!
分析:
备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。
main方法中我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。