🎯 什麼情境該想到我
當你「想在某個時間點把一個物件的內部狀態拍成快照,之後能把它還原回這個狀態,卻又不想把它的內部細節暴露出去」的時候(例如 undo、存檔/讀檔、交易回滾前的狀態保存)。
⚙️ 怎麼用(步驟 / 公式)
意圖:在不破壞封裝的前提下,擷取並外部化一個物件的內部狀態,以便日後可以把該物件還原到此狀態。
主要參與者 / 結構:
- Originator(原發者):知道自己的內部狀態,能建立備忘錄保存目前狀態,也能用備忘錄還原自己。
- Memento(備忘錄):儲存 Originator 的內部狀態;只對 Originator 開放內容,對外是不透明的。
- Caretaker(管理者):負責保管備忘錄(例如放進歷史堆疊),但不讀、不改它的內容。
做法要點:
- Originator 在需要時
createMemento(),把目前狀態封進一個備忘錄。 - Caretaker 把備忘錄收好(不窺探內容),需要時再交回。
- 要還原時,Originator 接受一個備忘錄並
restore()回該狀態。 - 關鍵在於:只有 Originator 能存取備忘錄的內部,封裝不被破壞。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 狀態很大或快照很頻繁時,保存多份備忘錄的記憶體成本很高。
- Caretaker 要管理備忘錄的生命週期(何時丟棄),否則歷史會無限累積。
- 若語言難以真正隱藏備忘錄內部,封裝保護會打折扣。
🔗 相關工具
- 命令模式 Command(命令的 undo 常靠備忘錄保存還原前的狀態)
- 狀態模式 State(都涉及物件狀態,但備忘錄是保存/還原、狀態模式是切換行為)
- 迭代器模式 Iterator(可用備忘錄保存走訪的位置狀態)
- 工具-封裝變化點(把「狀態如何保存」封裝起來,不外洩內部結構)
- 設計模式