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

新思科技同越南政府簽署諒解備忘錄
實(shí)踐GoF的23種設(shè)計(jì)模式:備忘錄模式

評(píng)論