解決問題
備忘錄模式-即對象的狀態(tài)記錄在備忘錄中,以方便可以將在未來的某一時刻或者某一狀態(tài)中將對象恢復至歷史的某一狀態(tài)蝙眶。
應用場景
在某種狀態(tài)下需要回滾到之前的狀態(tài)季希。這種應用場景很多:編輯器的自動保存與恢復功能;事務中的回滾機制幽纷;各操作平臺的回退功能等式塌。
原理圖
image
Caretaker: 守護者
Originator:起源,即需要被 “備忘”的對象
Memento:備忘錄
“守護者”保護持有操作“起源”友浸,令其生產“備忘錄”峰尝,并操作多個“備忘錄”以方便“起源”回滾(我認為該原理圖有問題,如果認為我理解有誤請留言)
我的理解是這樣的:
備忘錄不能由“Originator” 以外的任何對象生成收恢,也不可被“Originator”以外的任何對象修改武学;因此,“Memento”應該是“Originator”的一個私有的內部類伦意,否則的話前提條件不成立火窒。
“Caretaker” 應該是持有“Originator”,因為它的作用范圍是操作對象狀態(tài)的變更默赂、生產備忘記錄(也可以自動生產)沛鸵、回滾。
image
示例
比較簡單的示例缆八,直接用原理圖來代表示例
@Data
@AllArgsConstructor
public class Originator {
private int state;
private static Stack<Memento> mementos = new Stack<>();
?
public void save() {
mementos.push(new Memento(state));
}
?
public boolean rollback() {
if (mementos.isEmpty()) {
System.out.println("無歷史記錄");
return false;
} else {
this.state = mementos.pop().getState();
System.out.println(this.state);
return true;
}
}
?
@Data
@AllArgsConstructor
private static class Memento {
private int state;
}
}
?
?
public class CareTaker {
public static void main(String[] args) {
Originator originator = new Originator(0);
originator.save();
originator.setState(1);
originator.save();
originator.setState(2);
originator.save();
// 多次回滾
while (originator.rollback()) {
;
}
}
}