模式描述
備忘錄設(shè)計模式(Memento Design Pattern)是一種行為型設(shè)計模式,它的主要目的是在不破壞對象封裝性的前提下,捕捉和保存一個對象的內(nèi)部狀態(tài),以便稍后可以將對象恢復(fù)到該狀態(tài)。這種模式通常用于實現(xiàn)撤銷和重做操作。
主要角色
1、備忘錄(Memorandum) :保存了發(fā)起人的狀態(tài),從而能夠在適當?shù)臅r候恢復(fù)狀態(tài)。2. 發(fā)起人(Originator) :創(chuàng)建一個備忘錄,以表示其當前狀態(tài),并可以從備忘錄中恢復(fù)狀態(tài)。
引用場景
1.后退/前進:瀏覽器的后退/前進就是緩存頁面狀態(tài)的典型例子。2.撤銷/重做:通常基于備忘錄模式實現(xiàn)撤銷和重做操作。3.快照:保存某個時間點對象的狀態(tài)快照。
設(shè)計要點
1.僅僅存儲狀態(tài):備忘錄僅存儲對象的內(nèi)部狀態(tài),而不是存儲對象的引用。2.完全封裝:外部不會訪問到備忘錄類。3.避免權(quán)限問題:發(fā)起人應(yīng)該具有創(chuàng)建和訪問備忘錄的權(quán)限。
優(yōu)缺點
?輕松實現(xiàn)對象狀態(tài)的快照和恢復(fù)?分離了對象與狀態(tài)的保存與恢復(fù)過程?需要額外的空間來存儲狀態(tài)
與備忘錄模式類似的模式
?原型模式:對一個對象進行克隆,產(chǎn)生一個與原對象類似的新對象。
Java代碼示例
首先,我們創(chuàng)建一個發(fā)起人(Originator)類,它具有保存和恢復(fù)狀態(tài)的能力:
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();
}
}
接下來,我們創(chuàng)建備忘錄(Memento)類,用于保存發(fā)起人的狀態(tài):
publicclassMemento{
privateString state;
publicMemento(String state){
this.state = state;
}
publicString getState(){
return state;
}
}
現(xiàn)在,我們創(chuàng)建一個負責人(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)可以結(jié)合使用,以實現(xiàn)更加強大的撤銷/重做功能。命令模式可以用來記錄操作的順序和執(zhí)行操作,而備忘錄模式用來記錄操作前后的狀態(tài)。這樣一來,我們可以輕松地在操作序列中向前或向后移動,同時還可以保留每個操作的上下文信息。
-
JAVA
+關(guān)注
關(guān)注
19文章
2975瀏覽量
105201 -
JAVA語言
+關(guān)注
關(guān)注
0文章
138瀏覽量
20196
發(fā)布評論請先 登錄
相關(guān)推薦
恩智浦與Cohda無線簽署CAR 2 CAR通信聯(lián)盟“諒解備忘錄”
UDS診斷命令備忘錄
怎樣去搭建一種基于XR806的開源桌面備忘錄
全球半導(dǎo)體聯(lián)盟與中國半導(dǎo)體行業(yè)簽署合作備忘錄
是德科技與中國移動簽署諒解備忘錄
戴姆勒與百度簽署諒解備忘錄
嵌入式軟件設(shè)計模式 好文值得收藏
Vedanta與30家日本公司簽署諒解備忘錄
新思科技同越南政府簽署諒解備忘錄
實踐GoF的23種設(shè)計模式:備忘錄模式
![實踐GoF的23種設(shè)計<b class='flag-5'>模式</b>:<b class='flag-5'>備忘錄</b><b class='flag-5'>模式</b>](https://file1.elecfans.com/web2/M00/B1/09/wKgaomVhSNCAKQw4AAA5CexdZq4005.png)
評論