1 概念
又叫快照模式,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
备忘录模式的主要角色如下:
- 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
- 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
- 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
2 例子
游戏存档。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| public class GameRate { private int rate;
public int getRate() { return rate; }
public void setRate(int rate) { this.rate = rate; }
public GameRateMemento save() { return new GameRateMemento(rate); }
public void recoverState(GameRateMemento gameRateMemento) { this.rate = gameRateMemento.getRate(); }
@Override public String toString() { return "GameRate{" + "rate=" + rate + '}'; } }
public class GameRateMemento { private int rate;
public int getRate() { return rate; }
public void setRate(int rate) { this.rate = rate; }
public GameRateMemento(int rate) { this.rate = rate; } }
public class GameRateCaretaker { private GameRateMemento gameRateMemento;
public GameRateMemento getGameRateMemento() { return gameRateMemento; }
public void setGameRateMemento(GameRateMemento gameRateMemento) { this.gameRateMemento = gameRateMemento; } }
public class TestClient { public static void main(String[] args) { final GameRate gameRate = new GameRate(); gameRate.setRate(50); System.out.println(gameRate); final GameRateCaretaker gameRateCaretaker = new GameRateCaretaker(); gameRateCaretaker.setGameRateMemento(gameRate.save());
gameRate.setRate(70); System.out.println(gameRate);
gameRate.recoverState(gameRateCaretaker.getGameRateMemento()); System.out.println(gameRate);
} }
|
3 优缺点
优点:
- 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 *
- 实现了信息的封装,使得用户不需要关心状态的保存细节。
缺点:
- 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。