备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)
1.模式简介
备忘录模式能够在不破坏封装性的前提下,实现对象状态的保存和恢复工作,又叫快照模式或Token模式。保存对象的状态是为了以后在需要的时候快速恢复到保存时的状态,因此常用在备份、撤销操作上,例如编辑器里的撤销、游戏里的存档和悔棋等功能。
备忘录模式有三个组成部分:
Originagor(发起人):即需要备份的对象,可以创建备忘录,以及根据备忘录来恢复状态,可以看到备忘录提供的宽接口。
Memento(备忘录):存储Originator的部分或所有状态,对外提供宽窄接口。
CareTaker(管理人):负责保存Memento对象,只能看到备忘录提供的窄接口。
上面提到了宽接口和窄接口,有必要先解释一下,宽窄接口实际上代表了外界对备忘录的访问权限问题:
宽接口:能够看到备忘录保存的所有数据,一般只对发起人可见,对其他角色不可见。
窄接口:只能看到备忘录保存的部分数据(甚至可以实现不对外暴露任何数据),通常出于封装和安全性考虑,对发起人之外的其他角色只提供窄接口。
2. 示例
下面以一个简单的例子演示备忘录模式的用法,示例模仿棋类游戏中的悔棋,为简单起见,只记录棋子的坐标。
先定义棋子类Chessman,包含棋子的x坐标和y坐标:
public class Chessman { private int positionx; private int positiony; public void setPosition(int positionx, int positiony) { this.positionx = positionx; this.positiony = positiony; } @Override public String toString() { return "当前位置{" + "positionx=" + positionx + ", positiony=" + positiony + '}'; } public Chessman(int x, int y){ this.positionx = x; this.positiony = y; } public Memento createMemento(){ return new Memento(positionx, positiony); } public void restore(Memento memento){ this.positionx = memento.getPositionx(); this.positiony = memento.getPositiony(); } }
接着定义备忘录类Memento,用来存储棋子的坐标信息:
public class Memento { private int positionx; private int positiony; public int getPositionx() { return positionx; } public int getPositiony() { return positiony; } public Memento(int x, int y){ this.positionx = x; this.positiony = y; } }
定义管理者类CareTaker,外界通过该类获取备份信息: