模式描述
備忘錄設計模式(Memento Design Pattern)是一種行為型設計模式,它的主要目的是在不破壞對象封裝性的前提下,捕捉和保存一個對象的內部狀態,以便稍后可以將對象恢復到該狀態。這種模式通常用于實現撤銷和重做操作。
主要角色
1、備忘錄(Memorandum) :保存了發起人的狀態,從而能夠在適當的時候恢復狀態。2. 發起人(Originator) :創建一個備忘錄,以表示其當前狀態,并可以從備忘錄中恢復狀態。
引用場景
1.后退/前進:瀏覽器的后退/前進就是緩存頁面狀態的典型例子。2.撤銷/重做:通常基于備忘錄模式實現撤銷和重做操作。3.快照:保存某個時間點對象的狀態快照。
設計要點
1.僅僅存儲狀態:備忘錄僅存儲對象的內部狀態,而不是存儲對象的引用。2.完全封裝:外部不會訪問到備忘錄類。3.避免權限問題:發起人應該具有創建和訪問備忘錄的權限。
優缺點
?輕松實現對象狀態的快照和恢復?分離了對象與狀態的保存與恢復過程?需要額外的空間來存儲狀態
與備忘錄模式類似的模式
?原型模式:對一個對象進行克隆,產生一個與原對象類似的新對象。
Java代碼示例
首先,我們創建一個發起人(Originator)類,它具有保存和恢復狀態的能力:
publicclassOriginator{
privateString state;
publicvoid setState(String state){
this.state = state;
}
publicString getState(){
return state;
}
publicMemento saveStateToMemento(){
returnnewMemento(state);
}
publicvoid getStateFromMemento(Memento memento){
state = memento.getState();
}
}
接下來,我們創建備忘錄(Memento)類,用于保存發起人的狀態:
publicclassMemento{
privateString state;
publicMemento(String state){
this.state = state;
}
publicString getState(){
return state;
}
}
現在,我們創建一個負責人(Caretaker)類,用于管理備忘錄:
import java.util.ArrayList;
import java.util.List;
publicclassCaretaker{
privateList< Memento > mementoList =newArrayList< >();
publicvoid add(Memento state){
mementoList.add(state);
}
publicMementoget(int index){
return mementoList.get(index);
}
}
最后,我們在主類中使用這些類:
publicclassMementoPatternDemo{
publicstaticvoid main(String[] args){
Originator originator =newOriginator();
Caretaker caretaker =newCaretaker();
originator.setState("State #1");
originator.setState("State #2");
caretaker.add(originator.saveStateToMemento());
originator.setState("State #3");
caretaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: "+ originator.getState());
originator.getStateFromMemento(caretaker.get(0));
System.out.println("First saved State: "+ originator.getState());
originator.getStateFromMemento(caretaker.get(1));
System.out.println("Second saved State: "+ originator.getState());
}
}
擴展知識點
備忘錄模式與命令模式(Command Pattern)可以結合使用,以實現更加強大的撤銷/重做功能。命令模式可以用來記錄操作的順序和執行操作,而備忘錄模式用來記錄操作前后的狀態。這樣一來,我們可以輕松地在操作序列中向前或向后移動,同時還可以保留每個操作的上下文信息。
-
JAVA
+關注
關注
20文章
2984瀏覽量
106751 -
JAVA語言
+關注
關注
0文章
138瀏覽量
20501
發布評論請先 登錄
評論