【Java】23種設(shè)計(jì)模式——19.備忘錄模式
定義
備忘錄模式(Memento Pattern)是一種行為設(shè)計(jì)模式,它允許在不破壞封裝性的前提下捕獲并外部化一個(gè)對(duì)象的內(nèi)部狀態(tài),以便之后可以將該對(duì)象恢復(fù)到原先保存的狀態(tài)。
核心角色
- Originator(原發(fā)器):需要保存狀態(tài)的對(duì)象。
- Memento(備忘錄):存儲(chǔ)原發(fā)器內(nèi)部狀態(tài)的對(duì)象。
- Caretaker(管理者):負(fù)責(zé)保存和恢復(fù)備忘錄對(duì)象。
應(yīng)用場(chǎng)景
- 需要保存對(duì)象狀態(tài)快照以便回滾
- 需要實(shí)現(xiàn)撤銷/重做功能
- 需要保存對(duì)象歷史狀態(tài)
- 需要實(shí)現(xiàn)事務(wù)回滾機(jī)制
使用
-
原發(fā)器
/** * 備忘錄模式:原發(fā)器 * @Author:lyj * @Date:2025/5/21 09:54 */ public class Originator { private String state; /** * 設(shè)置狀態(tài) * @param state */ public void setMemento(String state) { this.state = state; System.out.println("原發(fā)器狀態(tài):" + state); } /** * 創(chuàng)建備忘錄 * @return */ public Memento saveMemento() { return new Memento(state); } /** * 恢復(fù)備忘錄 * @param memento */ public void restoreMemento(Memento memento) { this.state = memento.getState(); System.out.println("原發(fā)器狀態(tài):" + state); } } -
備忘錄
/** * 備忘錄模式:備忘錄 * @Author:lyj * @Date:2025/5/21 09:52 */ public class Memento { private String state; // 狀態(tài) public Memento(String state) { this.state = state; } public String getState() { return state; } public void setState(String state) { this.state = state; } } -
管理者
/** * 備忘錄模式-管理者: 負(fù)責(zé)保存?zhèn)渫泴?duì)象 * @Author:lyj * @Date:2025/5/21 10:36 */ public class Caretaker { private List<Memento> mementoList = new ArrayList<>(); /** * 添加備忘錄對(duì)象 * @param memento 備忘錄對(duì)象 */ public void add(Memento memento) { mementoList.add(memento); } /** * 獲取指定索引的備忘錄對(duì)象 * @param index 索引 * @return 備忘錄對(duì)象 */ public Memento get(int index) { return mementoList.get(index); } }
運(yùn)行測(cè)試數(shù)據(jù):
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
// 設(shè)置并保存賬套
originator.setMemento("狀態(tài)1");
caretaker.add(originator.saveMemento());
originator.setMemento("狀態(tài)2");
caretaker.add(originator.saveMemento());
// 恢復(fù)到指定狀態(tài)
originator.restoreMemento(caretaker.get(0));
運(yùn)行結(jié)果:

有志者,事竟成,破釜沉舟,百二秦關(guān)終屬楚; 苦心人,天不負(fù),臥薪嘗膽,三千越甲可吞吳。

浙公網(wǎng)安備 33010602011771號(hào)