设计模式的学习(十四):备忘录模式

备忘录模式

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 对象来显示对象的状态恢复。
设计模式的学习(十四):备忘录模式