备忘录模式(不重要):
对象行为型模式,在不破坏封装性的情况下,在对象之外保存这个对象的内部状态,之后可以恢复这个保存的状态。它提供了对象状态的撤销实现机制,当需要恢复对象的某一历史状态时使用,别名为token。
备忘录模式的结构:原发器(需要保存内部状态的类),备忘录类(存储原发器的内部状态),备忘录管理者(负责保存备忘录对象,不能修改备忘录对象)
只有原发器可以访问备忘录,备忘录保存或封装原发器的部分或全部内部状态,这些内部状态不能被其他对象访问(暴露内部状态会破坏封装性),要对备忘录的调用进行控制,如类的访问权限为包内可见或作为原发器的内部类
备忘录模式的适用场景:
1.需要恢复对象的某一历史状态
备忘录模式的优点:
1.提供了一种对象状态恢复机制
备忘录模式的缺点:
1.资源消耗大,保存的内部状态过多会占用大量的内存
备忘录模式的例子(以下棋为例)
原发器类和备忘录类(作为内部类)
public class Chess {
private String label;
private int x;
private int y;
public Chess(String label, int x, int y) {
this.label = label;
this.x = x;
this.y = y;
}
public ChessMemento save() {
return new ChessMemento(label, x, y);
}
public void restore(ChessMemento chessMemento) {
this.label = chessMemento.getLabel();
this.x = chessMemento.getX();
this.y = chessMemento.getY();
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() {
return "Chess [label=" + label + ", x=" + x + ", y=" + y + "]";
}
class ChessMemento {
private String label;
private int x;
private int y;
public ChessMemento(String label, int x, int y) {
this.label = label;
this.x = x;
this.y = y;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
}
备忘录管理者
public class ChessMementoCaretaker {
private ChessMemento chessMemento;
public ChessMemento getChessMemento() {
return chessMemento;
}
public void setChessMemento(ChessMemento chessMemento) {
this.chessMemento = chessMemento;
}
}
测试类
public class Main {
public static void main(String[] args) {
Chess chess = new Chess("士。。", 1, 2);
ChessMementoCaretaker caretaker = new ChessMementoCaretaker();
caretaker.setChessMemento(chess.save());
System.out.println(chess.toString());
chess.setX(7);
chess.setY(8);
System.out.println(chess.toString());
chess.restore(caretaker.getChessMemento());
System.out.println(chess.toString());
}
}
备忘录模式的应用:
1.DBMS的事务管理