備忘錄模式(Memento Pattern)是一種行為型設(shè)計(jì)模式,它在不破壞封裝的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣可以在需要時(shí)將對(duì)象恢復(fù)到先前的狀態(tài)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-803708.html
原理
- 發(fā)起人(Originator): 是擁有復(fù)雜內(nèi)部狀態(tài)的對(duì)象,它可以創(chuàng)建和恢復(fù)備忘錄。
- 備忘錄(Memento): 存儲(chǔ)發(fā)起人的內(nèi)部狀態(tài),通常是一個(gè)值對(duì)象或數(shù)據(jù)容器,對(duì)外提供有限的接口以防止直接訪問其內(nèi)部細(xì)節(jié)。
- 管理器/caretaker(Caretaker): 負(fù)責(zé)存儲(chǔ)和傳遞備忘錄對(duì)象,但不能對(duì)備忘錄的內(nèi)容進(jìn)行操作或解讀,只負(fù)責(zé)保管和還原發(fā)起人的狀態(tài)。
Java代碼示例
// 備忘錄類
public class Memento {
private final String state;
public Memento(String state) {
this.state = state;
}
// 只讀方法,允許發(fā)起者獲取備忘錄中的狀態(tài)
public String getState() {
return state;
}
}
// 發(fā)起人(如游戲角色)
public class Originator {
private String state;
// 設(shè)置或獲取當(dāng)前狀態(tài)
public void setState(String state) {
System.out.println("State changed to: " + state);
this.state = state;
}
public String getState() {
return state;
}
// 創(chuàng)建備忘錄并保存當(dāng)前狀態(tài)
public Memento saveToMemento() {
return new Memento(state);
}
// 從備忘錄恢復(fù)狀態(tài)
public void restoreFromMemento(Memento memento) {
this.state = memento.getState();
System.out.println("State restored to: " + state);
}
}
// 管理器/caretaker
public class Caretaker {
private Memento memento;
public void setMemento(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
Originator originator = new Originator();
originator.setState("State A");
// 保存當(dāng)前狀態(tài)到備忘錄
Caretaker caretaker = new Caretaker();
caretaker.setMemento(originator.saveToMemento());
// 改變狀態(tài)
originator.setState("State B");
// 恢復(fù)之前保存的狀態(tài)
originator.restoreFromMemento(caretaker.getMemento());
}
}
設(shè)想你正在玩一款電子游戲,每當(dāng)你存檔的時(shí)候,游戲就會(huì)把你的角色狀態(tài)(等級(jí)、裝備、位置等)打包成一個(gè)“備忘錄”,然后存入存檔文件中。當(dāng)你想要讀取存檔時(shí),游戲會(huì)從存檔文件中取出“備忘錄”,并將角色狀態(tài)恢復(fù)到存檔時(shí)的樣子。在這個(gè)過程中,游戲程序(發(fā)起人)通過備忘錄模式保護(hù)了內(nèi)部狀態(tài)信息,而存檔系統(tǒng)(管理器)僅負(fù)責(zé)保存和加載這些備忘錄。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-803708.html
應(yīng)用場(chǎng)景
- 文本編輯器:用戶可以隨時(shí)保存文檔狀態(tài)(備忘錄),并在需要時(shí)撤銷到之前的狀態(tài)。
- 游戲:保存和恢復(fù)玩家的游戲進(jìn)度或角色屬性狀態(tài)。
- 數(shù)據(jù)庫(kù)事務(wù):事務(wù)管理器使用備忘錄保存事務(wù)開始時(shí)的數(shù)據(jù)狀態(tài),在事務(wù)失敗時(shí)能夠回滾到初始狀態(tài)。
適用性
- 需要保存和恢復(fù)對(duì)象的內(nèi)部狀態(tài)到過去某個(gè)時(shí)刻的情況。
- 對(duì)象的狀態(tài)信息應(yīng)該作為值對(duì)象來(lái)存儲(chǔ),而不是通過復(fù)制對(duì)象的所有變量。
- 當(dāng)直接訪問對(duì)象內(nèi)部狀態(tài)違反封裝原則或者可能導(dǎo)致對(duì)象狀態(tài)不一致時(shí)。
到了這里,關(guān)于設(shè)計(jì)模式——備忘錄模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!