類圖
定義
在不破壞封裝性的前提下,捕獲一個對象內部狀態,並在該對象之外保存這個狀態。
這樣以後就 可將該對象恢復到原先保存的狀態
使用場景
- 需要保存和恢復數據的相關狀態場景
- 提供一個可回滾操作
- 需要監控的副本場景中
- 數據庫連接的事務管理就是用的備忘錄模式
注意事項
備忘錄的性能:不要在頻繁建立備份的場景中使用備忘錄模式以免控制不了備忘錄建立的對象數量,而且大對象的簡歷需要資源
備忘錄類
public class Memento {
/**
* 備忘錄狀態
*/
private String state = "";
public Memento(String _state) {
this.state = _state;
}
/**
* 獲取狀態
*
* @return 狀態
*/
public String getState() {
return state;
}
/**
* 設置狀態
*
* @param state 狀態
*/
public void setState(String state) {
this.state = state;
}
}
發起人角色
public class Originator {
/**
* 內部狀態
*/
private String state = "init";
/**
* 獲取狀態
*
* @return 狀態
*/
public String getState() {
return state;
}
/**
* 設置狀態
*
* @param state 狀態
*/
public void setState(String state) {
this.state = state;
}
/**
* 創建一個備忘錄
*
* @return 備忘錄
*/
public Memento createMemento() {
return new Memento(state);
}
/**
* 回覆一個備忘錄
*
* @param memento 備忘錄
*/
public void restoreMemento(Memento memento) {
setState(memento.getState());
}
}
備忘錄管理者
public class Caretaker {
/**
* 備忘錄對象
*/
private Memento memento;
/**
* 獲取備忘錄對象
*
* @return 備忘錄對象
*/
public Memento getMemento() {
return memento;
}
/**
* 設置備忘錄對象
*
* @param memento 備忘錄對象
*/
public void setMemento(Memento memento) {
this.memento = memento;
}
}
場景類
public class Client {
public static void main(String[] args) {
// 定義發起人
Originator originator = new Originator();
// 定義備忘錄管理者
Caretaker caretaker = new Caretaker();
// 創建一個備忘錄
caretaker.setMemento(originator.createMemento());
// 讀取備忘錄內容
System.out.println("備忘錄狀態:" + caretaker.getMemento().getState());
System.out.println("發起人狀態:" + originator.getState());
// 改變發起人內容
originator.setState("new state");
// 讀取發起人內容
System.out.println("發起人狀態:" + originator.getState());
// 恢復一個備忘錄
originator.restoreMemento(caretaker.getMemento());
System.out.println("發起人狀態:" + originator.getState());
}
}
運行結果
備忘錄狀態:init
發起人狀態:init
發起人狀態:new state
發起人狀態:init