介紹
備忘錄模式(Memento Pattern)保存一個(gè)對象的某個(gè)狀態(tài)镀钓,以便在適當(dāng)?shù)臅r(shí)候恢復(fù)對象。備忘錄模式屬于行為型模式镀迂。當(dāng)我們玩單機(jī)游戲時(shí)就有個(gè)存檔的功能丁溅,這樣就是備忘錄模式的應(yīng)用。
備忘錄模式提供了一種狀態(tài)恢復(fù)的實(shí)現(xiàn)機(jī)制探遵,使得用戶可以方便地回到一個(gè)特定的歷史步驟窟赏,當(dāng)新的狀態(tài)無效或者存在問題時(shí),可以使用暫時(shí)存儲起來的備忘錄將狀態(tài)復(fù)原箱季,當(dāng)前很多軟件都提供了撤銷(Undo)操作涯穷,其中就使用了備忘錄模式。
定義
備忘錄模式(Memento Pattern):在不破壞封裝的前提下藏雏,捕獲一個(gè)對象的內(nèi)部狀態(tài)拷况,并在該對象之外保存這個(gè)狀態(tài),這樣可以在以后將對象恢復(fù)到原先保存的狀態(tài)掘殴。它是一種對象行為型模式赚瘦,其別名為Token。
結(jié)構(gòu)圖
在備忘錄模式結(jié)構(gòu)圖中包含如下幾個(gè)角色:
- Originator(原發(fā)器):它是一個(gè)普通類奏寨,可以創(chuàng)建一個(gè)備忘錄起意,并存儲它的當(dāng)前內(nèi)部狀態(tài),也可以使用備忘錄來恢復(fù)其內(nèi)部狀態(tài)服爷,一般將需要保存內(nèi)部狀態(tài)的類設(shè)計(jì)為原發(fā)器杜恰。
- Memento(備忘錄):存儲原發(fā)器的內(nèi)部狀態(tài)获诈,根據(jù)原發(fā)器來決定保存哪些內(nèi)部狀態(tài)。備忘錄的設(shè)計(jì)一般可以參考原發(fā)器的設(shè)計(jì)心褐,根據(jù)實(shí)際需要確定備忘錄類中的屬性舔涎。需要注意的是,除了原發(fā)器本身與負(fù)責(zé)人類之外逗爹,備忘錄對象不能直接供其他類使用亡嫌,原發(fā)器的設(shè)計(jì)在不同的編程語言中實(shí)現(xiàn)機(jī)制會有所不同。
- Caretaker(負(fù)責(zé)人):負(fù)責(zé)人又稱為管理者掘而,它負(fù)責(zé)保存?zhèn)渫浶冢遣荒軐渫浀膬?nèi)容進(jìn)行操作或檢查。在負(fù)責(zé)人類中可以存儲一個(gè)或多個(gè)備忘錄對象袍睡,它只負(fù)責(zé)存儲對象知染,而不能修改對象,也無須知道對象的實(shí)現(xiàn)細(xì)節(jié)斑胜。
案例
Originator(原發(fā)器)
public class Originator {
private String state;
public Originator() {}
// 創(chuàng)建一個(gè)備忘錄對象
public Memento createMemento() {
return new Memento(this);
}
// 根據(jù)備忘錄對象恢復(fù)原發(fā)器狀態(tài)
public void restoreMemento(Memento m) {
state = m.getState();
}
public void setState(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
}
Memento(備忘錄)
public class Memento {
private String state;
public Memento(Originator o) {
state = o.getState();
}
public void setState(String state) {
this.state = state;
}
public String getState() {
return this.state;
}
}
Caretaker(負(fù)責(zé)人)
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
總結(jié)
所謂備忘錄模式就是在不破壞封裝的前提下控淡,捕獲一個(gè)對象的內(nèi)部狀態(tài),并在該對象之外保存這個(gè)狀態(tài)止潘,這樣可以在以后將對象恢復(fù)到原先保存的狀態(tài)掺炭。很多時(shí)候我們總是需要記錄一個(gè)對象的內(nèi)部狀態(tài),這樣做的目的就是為了允許用戶取消不確定或者錯(cuò)誤的操作凭戴,能夠恢復(fù)到他原先的狀態(tài)涧狮,使得他有"后悔藥"可吃。為了符合迪米特原則么夫,還要增加一個(gè)管理備忘錄的類者冤。為了節(jié)約內(nèi)存,可使用原型模式+備忘錄模式魏割。