備忘錄模式 屬於行為型模式。它在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態,以便以後將該對象恢復到原先保存的狀態。
// 發起人
public class Originator {
private int number;
private File file;
// 創建備忘錄
public Memento getMemento() {
return new Memento(this);
}
// 恢復狀態
public void setMemento(Memento m) {
this.number = m.number;
this.file = m.file;
}
// 內部類:備忘錄,僅 Originator 可訪問
private static class Memento implements Serializable {
private int number;
private File file;
public Memento(Originator o) {
this.number = o.number;
this.file = o.file;
}
}
}
// 管理者
public class Caretaker {
private Memento memento;
public void saveMemento(Memento m) { this.memento = m; }
public Memento getMemento() { return memento; }
}
// 客戶端
public class Client {
public static void main(String[] args) {
Originator o = new Originator();
Caretaker c = new Caretaker();
c.saveMemento(o.getMemento()); // 保存狀態
// ... 修改 o 的狀態 ...
o.setMemento(c.getMemento()); // 恢復狀態
}
}
在 JSP/Servlet 或 MVC 框架中,用戶提交表單驗證失敗時,需回顯已輸入數據。此時可將表單數據封裝為 JavaBean,放入 request 或 session 作用域(即充當 Caretaker),頁面重渲染時從 Bean 讀取數據填充表單,這本質上就是備忘錄模式的應用。