備忘錄模式介紹
備忘錄模式是可以恢復或者說回滾、配置、版本、悔棋為核心功能的設計模式,而這種設計模式屬於行為模式。在功能實現上是以不破壞原對象為基礎增加備忘錄操作類,記錄原對象的行為從而實現備忘錄模式。
備忘錄的設計實現方式,重點在於不更改原有類的基礎上,增加備忘錄存放記錄。
備忘錄允許在不暴露對象實現細節的情況下保存和恢復對象之前的狀態。
備忘錄模式將創建狀態快照的工作委派給實際狀態的擁有者原發器對象,這樣其他對象就不再需要從“外部”復制編輯器狀態,編輯器類擁有其狀態的完全訪問權,可自行生成快照。建議將對象狀態的副本存儲在一個名為備忘錄的特殊對象中,除了創建備忘錄的對象外,任何對象都不能訪問備忘錄的內容,其他對象必須使用受限接口與備忘錄進行交互,它們可以獲取快照的元數據,但不能獲取快照中原始對象的狀態。
備忘錄模式結構
基於嵌套類的實現
-
1、原發器
可以生成自身狀態的快照,也可在需要時通過快照恢復自身的狀態。
-
2、備忘錄
原發器狀態快照的值對象。通常做法是將備忘錄設為不可變的,並通過構造函數一次性傳遞數據。
-
3、負責人
僅知道“何時”和“為何”捕捉原發器的狀態,以及何時恢復狀態。
-
4、實現類
備忘錄類將被嵌套在原發器中,這樣原發器就可訪問備忘錄的成員變量和方法,即使這些方法被聲明為私有。另一方面,負責人對於備忘錄的成員變量和方法的訪問權限非常有限。它們只能在棧中保存備忘錄,而不能修改其狀態。
適合場景
- 當需要創建對象狀態快照來恢復其之前的狀態時。
此模式允許你復制對象中的全部狀態,並將其獨立於對象進行保存。
- 直接訪問對象的成員變量,獲取器或設置器將導致封裝被突破時。
備忘錄讓對象自行負責創建其狀態的快照。任何其他對象都不能讀取快照,有效的保障了數據的安全性。
實現方式
- 確定擔任原發器角色的類。(明確程序使用的一個原發器中心 對象,還是多個較小對象)
- 創建備忘錄類。(聲明對應每個原發器成員變量的備忘錄成員變量)
- 將備忘錄類設為不可變。(只可通過構造函數接收數據)
- 語言支持嵌套類則將備忘錄寫在原發器中,如果不支持,可從備忘錄中抽取一個空接口,然后讓其他所有對象通過接口來引用備忘錄。
- 在原發器中添加一個創建備忘錄的方法。
- 在原發器類中添加一個用於恢復自身狀態的方法。
- 不管負責人是命令對象、歷史記錄或其他完全不同的方法,它都必須要知道何時向原發器請求新的備忘錄、如何存儲備忘錄以及何時使用特定備忘錄來對原發器進行恢復。
- 負責人與原發器之間的連接可以移動到備忘錄中。
優缺點
優點
- 在不破壞對象封裝情況的前提下創建對象狀態快照。
- 可通過讓負責人維護原發器狀態歷史記錄來簡化原發器代碼。
缺點
- 若客戶端頻繁地創建備忘錄,程序將消耗大量內存。
- 負責人必須完整跟蹤元發器的生命周期,這樣才可以進行銷毀。
Demo
備忘錄不會影像它所處理的對象的內部結構,也不會影響快照中保存的數據。
小寄語
人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。
原創不易,給個關注。
我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩關注、點贊、轉發 謝謝。