天天看點

行為型設計模式: 備忘錄模式(Memento Pattern)行為型設計模式:備忘錄模式(Memento Pattern)

行為型設計模式:備忘錄模式(Memento Pattern)

CSDN專欄: 設計模式(UML/23種模式)

備忘錄模式(Memento Pattern): 在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。這樣以後就可将該對象恢複到原先儲存的狀态。

備忘錄模式(Memento Pattern)屬于行為型模式。行為型模式涉及到算法和對象間職責的配置設定;行為型模式不僅描述對象或類的模式,還描述它們之間的通信模式。行為型模式刻劃了在運作時難以跟蹤的複雜的控制流;它們将你的注意力從控制流轉移到對象間的聯系方式上來。行為型模式主要包括:Chain of Responsibility模式、Command模式、Interpreter模式、Iterator模式、Mediator模式、Memento模式、Observer模式、State模式、Strategy模式、Template Method模式和Visitor模式。行為型模式在某種程度上具有相關性。

模式簡介

GOF的《設計模式》指出Memento模式的意圖是:

在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态。這樣以後就可将該對象恢複到原先儲存的狀态。

有時有必要記錄一個對象的内部狀态。為了允許使用者取消不确定的操作或從錯誤中恢複過來,需要實作檢查點和取消機制 , 而要實作這些機制,你必須事先将狀态資訊儲存在某處,這樣才能将對象恢複到它們先前的狀态。但是對象通常封裝了其部分或所有的狀态資訊 , 使得其狀态不能被其他對象通路,也就不可能在該對象之外儲存其狀态。而暴露其内部狀态又将違反封裝的原則,可能有損應用的可靠性和可擴充性。

Memento模式适用于以下場景:

  • 必須儲存一個對象在某一個時刻的 (部分)狀态, 這樣以後需要時它才能恢複到先前的狀态。
  • 如果一個用接口來讓其它對象直接得到這些狀态,将會暴露對象的實作細節并破壞對象的封裝性。

模式圖解

Memento模式的UML示例如下:

行為型設計模式: 備忘錄模式(Memento Pattern)行為型設計模式:備忘錄模式(Memento Pattern)

Memento模式的工作過程如下:

  • Memtoto備忘錄存儲原發器對象的内部狀态。Originator原發器根據需要決定備忘錄存儲原發器的哪些内部狀态;禁止其他對象通路備忘錄。
  • Originator原發器建立一個備忘錄, 用以記錄目前時刻它的内部狀态,并且可以使用備忘錄恢複内部狀态.。
  • Caretaker管理器負責儲存備忘錄但是不能對内容進行操作或檢查。
  • Caretaker管理器向Originator原發器請求一個備忘錄, 保留一段時間後, 将其送回給Originator原發器

Memento模式的有益效果如下:

  • 有利于保持封裝邊界:使用備忘錄可以避免暴露一些隻應由原發器管理卻又必須存儲在原發器之外的資訊。
  • 有利于簡化原發器: Originator負責保持客戶請求過的内部狀态版本,讓客戶管理它們請求的狀态将會簡化Originator, 并且使得客戶工作結束時無需通知原發器。
  • 管理和維護備忘錄的成本較高:建立、恢複和删除備忘錄的操作均有較大開銷。

Command模式:指令可使用備忘錄來為可撤消的操作維護狀态。Iterator模式: 如前所述備忘錄可用于疊代。

模式執行個體

[TODO]

系列文章

  • CSDN專欄: 設計模式(UML/23種模式)
  • Github專欄: 設計模式(UML/23種模式)

參考文獻

  • GOF的設計模式:可複用面向對象軟體的基礎
  • 設計模式之禅
  • 圖說設計模式

繼續閱讀