備忘錄模式通常不怎麼用,它也是一種行爲型設計模式。數據庫
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態,這樣之後就能夠將該對象恢復到原先保存的狀態。設計模式
備忘錄模式包含兩個關鍵角色緩存
原始對象(Originator)
:除了建立自身所須要的屬性和業務邏輯外,還經過提供方法 create()
和 restore(memento)
來保存和恢復對象副本markdown
備忘錄(Memento
):用於保存原始對象的全部屬性狀態,以便在將來進行撤銷操做函數
下面舉的是單狀態備忘錄模式,多狀態就須要用到Map
集合了。性能
//發起人角色
public class Originator{
//內部狀態
private String state = "";
public String getState(){
return state;
}
public void setState(String state){
this.state = state;
}
//建立一個備忘錄
public Memento createMemento(){
return new Memento(this.state);
}
//恢復一個備忘錄
public void restoreMemento(Memento _memento){
this.setState(_memento.getState());
}
}
//備忘錄角色
public class Memento{
//發起人的內部狀態
private String state = "";
//構造函數
public Memento(String _state){
this.state = _state;
}
public String getState(){
return state;
}
public void setState(String state){
this.state = state;
}
}
//備忘錄管理員角色
public class Caretaker{
//備忘錄對象
private Memento memento;
public Memento getMemento(){
return 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());
//恢復一個備忘錄
originator.restoreMemento(caretaker.getMemento());
}
}
複製代碼
須要保存一個對象在某一個時刻的狀態時刻this
提供一個可回滾的操做,好比Word
中的CTRL + Z
組合鍵spa
須要監控的副本場景中。例如要監控一個對象的屬性,可是監控又不該該做爲系統的主業務來調用,能夠考慮備份一個副本,在子線程中分析處理線程
數據庫鏈接的事務管理就是用的備忘錄模式設計
可以快速撤消對對象狀態的更改
可以提高代碼的擴展性。 備忘錄模式是經過增長外部對象來保存原始對象的狀態,而不是在原始對象中新增狀態記錄,當再也不須要保存對象狀態時就能很方便地取消這個對象。同理,新增備忘錄對象也很是容易
可以幫助緩存記錄歷史對象狀態。好比,在客服會話聊天中,對於某一些重要的對話(退換貨、價保等),咱們會記錄這些對象數據,傳統的作法是調用一次服務接口,一旦服務出現故障就很容易致使聊天回覆速度變慢;而使用備忘錄模式則可以記錄這些重要的數據信息(用戶提供的訂單數據),而不須要反覆查詢接口,這樣能提高回覆客戶的效率
備忘錄的生命週期,要主動去管理,釋放它們
備忘錄的性能,備份太多,勢必對性能形成影響