备忘录模式
备忘录模式提供了一种状态恢复的机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂存的备忘录将状态恢复。
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
角色
- 原发器(Originator)
普通类,可以创建一个备忘录,并存储其当前内部状态,也可以使用备忘录来恢复其内部状态,一般需要保存内部状态的类设计为原发器。
- 备忘录(Memento)
存储原发器的状态,根据原发器来决定保存哪些内部状态。
- 管理者(CareTaker)
负责保存备忘录,但是不能对备忘录的内容进行操作或检查。
案例
悔棋
Chess: 原发器
/**
* 原发器
*/
public class Chess
{
public String lable;
public int x;
public int y;
public Chess(String label, int x, int y) {
this.lable = label;
this.x = x;
this.y = y;
}
public void setLabel(String label) {
this.lable = label;
}
public void setXY(int x, int y) {
this.x = x;
this.y = y;
}
// 保存状态
public Chess save(){
return this;
}
// 恢复状态
public void recover(ChessMemento memento){
System.out.println("悔棋");
lable = memento.lable;
x = memento.x;
y = memento.y;
}
@Override
public String toString() {
return "Chess{" +
"lable='" + lable + '\'' +
", x=" + x +
", y=" + y +
'}';
}
}
ChessMemento: 棋子备忘录
public class ChessMemento {
public String lable;
public int x;
public int y;
public ChessMemento() {}
public void save(Chess chess) {
this.lable = chess.lable;
this.x = chess.x;
this.y = chess.y;
}
}
MementoCareaTaker: 管理者
public class MementoCareaTaker {
private ChessMemento chessMemento;
public MementoCareaTaker() {
chessMemento = new ChessMemento();
}
public ChessMemento getChessMemento() {
return chessMemento;
}
}
Main:
public class Main {
public static void main(String[] args) {
MementoCareaTaker mementoCareaTaker = new MementoCareaTaker();
Chess chess = new Chess("车", 1, 1);
mementoCareaTaker.getChessMemento().save(chess);
display(chess);
chess.setXY(2,2);
display(chess);
chess.recover(mementoCareaTaker.getChessMemento());
display(chess);
}
public static void display(Chess chess){
System.out.println(chess);
}
}
Output:
Chess{lable='车', x=1, y=1}
Chess{lable='车', x=2, y=2}
悔棋
Chess{lable='车', x=1, y=1}
备忘录模式的优缺点
优点:
- 提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤。
- 实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。
缺点:
- 保存状态的资源消耗大
应用场景
- 需要保存一个对象在某一个时刻的全部状态或部分状态状态,以便需要在后面需要时可以恢复到先前的状态。
- 防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。