備忘錄模式(Mementos Pattern)

Morgana - Persona5

目標

在不破壞封裝及單一職責原則的情況下創立/還原類別的備份。

若要建立備份,簡單的方法是在類別內部建立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