備忘錄模式(Mementos Pattern)
目標
在不破壞封裝及單一職責原則的情況下創立/還原類別的備份。
若要建立備份,簡單的方法是在類別內部建立Save()
/Load()
等方法,但會使此類別多了備份的職責。
若在其他類別執行備份,則需要將想備份的資料設為 public 或設定 getter,導致破壞封裝。
架構
想法:原類別使用 Memento 備份/還原, 由 Caretaker 管理 Memento
- Originator: 需要備份的類別,產生 Memento,且可用其還原
Memento CreateMemento()
void RestoreFromMemento(Memento)
- Memento: 儲存備份檔案的類別
- 純資料,不可變(immutable)
- Caretaker: 管理備份的類別
- 呼叫 Originator 以產生備份類別/用備份類別還原
- 管理備份
- 讀寫檔案
- 管理路徑
- 管理多份備份
實作
- Originator 可以 hold Caretaker reference 使兩者的生命周期同步
分析
缺點
- Memento 資料會額外占用記憶體,且需要花時間產生
用途
- 備份/還原(存/讀檔)
其他
- Memento 有「印象」、「紀念」的意思
- 有同名電影譯為「記憶拼圖」
- 在 Persona5 譯為「印象空間」
- Memento Mori: 勿忘你終有一死
參考資料
- Wiki: Memento Pattern
- Head-First Design Pattern
- 大話設計模式
- 設計模式與遊戲開發的完美結合
- 技術筆記 - Memento Pattern