備忘錄模式(Mementos Pattern)

目標

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

若要建立備份,簡單的方法是在類別內部建立Save()/Load()等方法,但會使類別多了備份的職責。
若在其他類別執行備份,則需要將想備份的資料設為public或設定Getter,破壞封裝。

架構

想法:originator只產生memento/使用memento還原, 由caretaker管理memento

  • originator: 需要備份的類別
    • Memento CreateMemento()
    • void RestoreFromMemento(Memento)
  • memento: 儲存備份檔案的類別
    • 純資料,不可變(immutable)
  • caretaker: 管理備份的類別
    • 呼叫 originator 執行 備份/還原的操作
    • 管理備份
      • 存讀檔,路徑
      • 管理多份備份

實作

  • memento可以是interface或abstract class,以避免被originator以外的類別修改
  • originator可以hold caretaker reference使兩個物件的生命周期同步

分析

缺點

  • memento額外占用記憶體

用途

  • 備份/還原(存/讀檔)

其他

單詞memento有「印象」、「紀念」的意思,有同名電影譯為「記憶拼圖」,在Persona5譯為「印象空間」

參考資料

  • Wiki
  • Head-First Design Pattern
  • 大話設計模式
  • 設計模式與遊戲開發的完美結合
  • http://twmht.github.io/blog/posts/design-pattern/memento.html