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,外界通过该类获取备份信息:

复制代码