Python設計模式:備忘錄模式

1. 什么是備忘錄模式?

備忘錄模式是一種行為設計模式,它允許在不暴露對象內部狀態的情況下,保存和恢復對象的狀態。備忘錄模式的核心思想是將對象的狀態保存到一個備忘錄對象中,以便在需要時可以恢復到之前的狀態。這種模式通常用于實現撤銷操作或歷史記錄功能。

備忘錄模式通常包含三個主要組成部分:發起人(Originator)、備忘錄(Memento)和管理者(Caretaker)

  1. 發起人(Originator):發起人是需要保存其狀態的對象。它負責創建一個備忘錄以保存其當前狀態,并可以使用備忘錄恢復其狀態。發起人通常包含一些業務邏輯和狀態信息。
  2. 備忘錄(Memento):備忘錄用于存儲發起人的內部狀態。備忘錄對象通常是不可變的,以防止外部對象修改其狀態。備忘錄只提供狀態的存儲,不提供任何業務邏輯。
  3. 管理者(Caretaker):管理者負責管理備忘錄對象,保存和恢復發起人的狀態。管理者不需要了解備忘錄的具體內容,只需保存和恢復。它通常維護一個備忘錄列表,以便在需要時可以訪問。

備忘錄模式在軟件設計中具有多種優點:

  1. 封裝性:備忘錄模式可以在不暴露對象內部狀態的情況下保存和恢復狀態。發起人可以將其狀態封裝在備忘錄對象中,外部對象無法直接訪問或修改這些狀態。
  2. 簡化代碼:通過將狀態管理邏輯分離到備忘錄對象中,可以簡化發起人的代碼。發起人只需關注其業務邏輯,而不必處理狀態的保存和恢復。
  3. 支持撤銷操作:備忘錄模式可以輕松實現撤銷操作,允許用戶恢復到之前的狀態。這在許多應用程序中都是一個重要的功能,例如文本編輯器、圖形編輯器等。
# 備忘錄類
class Memento:def __init__(self, state):self.__state = state  # 將狀態設置為私有屬性def get_state(self):return self.__state  # 提供訪問方法# 發起人類
class TextEditor:def __init__(self):self.text = ""def set_text(self, text):self.text = textprint(f"Current text: '{self.text}'")def save(self):return Memento(self.text)def restore(self, memento):self.text = memento.get_state()print(f"Restored text: '{self.text}'")# 管理者類
class Caretaker:def __init__(self):self.mementos = []def save_memento(self, memento):self.mementos.append(memento)def get_memento(self, index):return self.mementos[index]# 客戶端代碼
if __name__ == "__main__":def test1():editor = TextEditor()editor.set_text("Hello, World!")memento = editor.save()  # 保存狀態# 嘗試直接訪問 memento.__statetry:print(memento.__state)  # 這將引發 AttributeErrorexcept AttributeError:print("Cannot access memento state directly!")  # 這行會被執行# 正確的方式是使用 get_state 方法print(f"Accessing memento state through method: '{memento.get_state()}'")def test2():editor = TextEditor()caretaker = Caretaker()editor.set_text("Hello, World!")caretaker.save_memento(editor.save())  # 保存狀態editor.set_text("Hello, Python!")caretaker.save_memento(editor.save())  # 保存新狀態# 恢復狀態editor.restore(caretaker.get_memento(0))  # 輸出: Restored text: 'Hello, World!'def test3():editor = TextEditor()caretaker = Caretaker()# 設置文本并保存狀態editor.set_text("Hello, World!")caretaker.save_memento(editor.save())editor.set_text("Hello, Python!")caretaker.save_memento(editor.save())# 撤銷到之前的狀態print("\nUndoing last operation:")last_memento = caretaker.get_memento(0)  # 獲取第一個備忘錄editor.restore(last_memento)  # 恢復到 'Hello, World!'# 繼續撤銷操作print("\nUndoing to initial state:")last_memento = caretaker.get_memento(1)  # 獲取第二個備忘錄editor.restore(last_memento)  # 恢復到 'Hello, Python!print('test1:')test1()print('\ntest2:')test2()print('\ntest3:')test3()
test1:
Current text: 'Hello, World!'
Cannot access memento state directly!
Accessing memento state through method: 'Hello, World!'test2:
Current text: 'Hello, World!'
Current text: 'Hello, Python!'
Restored text: 'Hello, World!'test3:
Current text: 'Hello, World!'
Current text: 'Hello, Python!'Undoing last operation:
Restored text: 'Hello, World!'Undoing to initial state:
Restored text: 'Hello, Python!'

代碼解析

  • TextEditor 類是發起人,包含一個 text 屬性來保存文本內容。
    • set_text 方法用于設置文本并打印當前狀態。
    • save 方法創建并返回一個備忘錄對象,保存當前文本狀態。
    • restore 方法使用備忘錄對象恢復文本狀態
  • Memento 類用于存儲發起人的狀態。在這個例子中,它保存了文本編輯器的文本狀態。
    • __state 屬性用于保存發起人的內部狀態,并通過 get_state 方法提供訪問。
  • Caretaker 類負責管理備忘錄對象,維護一個 mementos 列表來保存多個備忘錄。
    • save_memento 方法用于將備忘錄對象添加到列表中。
    • get_memento 方法根據索引返回相應的備忘錄對象。
  • test1:Memento 類封裝了 TextEditor 的內部狀態。外部對象無法直接訪問 Memento__state 屬性,從而保護了發起人的內部狀態。
  • test2:TextEditor 類的代碼保持簡潔,專注于文本的設置和恢復。狀態的管理邏輯被轉移到 Caretaker 類中,從而簡化了發起人的代碼。
  • test3: 用戶可以通過 Caretaker 類保存多個備忘錄,并在需要時恢復到之前的狀態。通過調用 restore 方法,用戶可以輕松實現撤銷操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76919.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76919.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76919.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python基礎語法3

目錄 1、函數 1.1、語法格式 1.2、函數返回值 1.3、變量作用域 1.4、執行過程 1.5、鏈式調用 1.6、嵌套調用 1.7、函數遞歸 1.8、參數默認值 1.9、關鍵字參數 2、列表 2.1、創建列表 2.2、下標訪問 2.3、切片操作 2.4、遍歷列表元素 2.5、新增元素 2.6、查找元…

JavaEE學習筆記(第二課)

1、好用的AI代碼工具cursor 2、Java框架:Spring(高級框架)、Servelt、Struts、EJB 3、Spring有兩層含義: ①Spring Framework(原始框架) ②Spring家族 4、Spring Boot(為了使Spring簡化) 5、創建Spring Boot 項目 ① ② ③…

基于Flask與Ngrok實現Pycharm本地項目公網訪問:從零部署

目錄 概要 1. 環境與前置條件 2. 安裝與配置 Flask 2.1 創建虛擬環境 2.2 安裝 Flask 3. 安裝與配置 Ngrok 3.1 下載 Ngrok 3.2 注冊并獲取 Authtoken 4. 在 PyCharm 中創建 Flask 項目 5. 運行本地 Flask 服務 6. 啟動 Ngrok 隧道并獲取公網地址 7. 完整示例代碼匯…

Ragflow、Dify、FastGPT、COZE核心差異對比與Ragflow的深度文檔理解能力??和??全流程優化設計

一、Ragflow、Dify、FastGPT、COZE核心差異對比 以下從核心功能、目標用戶、技術特性等維度對比四款工具的核心差異: 核心功能定位 ? Ragflow:專注于深度文檔理解的RAG引擎,擅長處理復雜格式(PDF、掃描件、表格等)的…

LeetCode[232]用棧實現隊列

思路: 一道很簡單的題,就是棧是先進后出,隊列是先進先出,用兩個棧底相互對著,這樣一個隊列就產生了,右棧為空的情況,左棧棧底就是隊首元素,所以我們需要將左棧全部壓入右棧&#xff…

postman 刪除注銷賬號

一、刪除賬號 1.右上角找到 頭像,view profile https://123456-6586950.postman.co/settings/me/account 二、找回賬號 1.查看日志所在位置 三、postman更新后只剩下history 在 Postman 中,如果你發現更新后只剩下 History(歷史記錄&…

微服務相比傳統服務的優勢

這是一道面試題,咱們先來分析這道題考察的是什么。 如果分析面試官主要考察以下幾個方面: 技術理解深度 你是否清楚微服務架構(Microservices)和傳統單體架構(Monolithic)的本質區別。能否從設計理念、技術…

【KWDB 創作者計劃】_深度學習篇---向量指令集

文章目錄 前言一、加速原理數據級并行(DLP)計算密度提升減少指令開銷內存帶寬優化隱藏內存延遲二、關鍵實現技術1. 手動向量化(Intrinsics)優勢挑戰2. 編譯器自動向量化限制3. BLAS/LAPACK庫優化4. 框架級優化三、典型應用場景矩陣運算卷積優化歸一化/激活函數嵌入層(Embe…

跳躍游戲(每日一題-中等)

題解:定義一個變量,用來存儲可以到達的最遠位置。初始化為0。 然后對數組進行遍歷,遍歷開始的時候,先判斷當前這個位置和最遠位置誰大,如果最遠位置比較大,那么就說明當前這個位置也能達到,就看…

第七篇:linux之基本權限、進程管理、系統服務

第七篇:linux之基本權限、進程管理、系統服務 文章目錄 第七篇:linux之基本權限、進程管理、系統服務一、基本權限1、什么是權限?2、為什么要有權限?3、權限與用戶之間的關系?4、權限對應的數字含義5、使用chmod設定權…

音視頻小白系統入門課-2

本系列筆記為博主學習李超老師課程的課堂筆記,僅供參閱 往期課程筆記傳送門: 音視頻小白系統入門筆記-0音視頻小白系統入門筆記-1 課程實踐代碼倉庫:傳送門 音視頻編解碼 可以通過ffmpeg -f avfoundation -list_devices true -i "&…

外賣“三國殺”開新局,餓了么已手握AI牌

【潮汐商業評論/原創】 01 新戰役,新變量 外賣行業,又迎來了新一輪戰役。 前有京東宣布斥資百億進軍外賣市場,后有美團宣布發布即時零售品牌“美團閃購”。雙方在隔空秀肌肉、彰顯自身實力的同時,行業巨頭圍繞本地生活服務的攻…

HAProxy 和 Keepalived 區別

HAProxy 和 Keepalived 是在構建高可用和可擴展Web服務時常用的兩個開源軟件,但它們的核心功能和目的有顯著區別。 簡單來說: HAProxy: 主要是一個 負載均衡器 (Load Balancer) 和 反向代理 (Reverse Proxy)。它負責將客戶端的請求智能地分發到后端的多…

YOLO算法的革命性升級:深度解析Repulsion損失函數在目標檢測中的創新應用

## 一、目標檢測的痛點與YOLO的局限性 在自動駕駛、智能監控等復雜場景中,目標檢測算法常面臨致命挑戰——遮擋問題。當多個物體相互遮擋時,傳統檢測器容易出現漏檢、誤檢現象,YOLO系列算法盡管在速度與精度上表現優異,但在處理密集遮擋目標時仍存在明顯短板。 ### 1.1 遮…

第一篇:Django簡介

第一篇:Django簡介 文章目錄 第一篇:Django簡介一、純手寫一個簡易版的web框架1、軟件開發架構2、HTTP協議3、簡易的socket服務端4、wsgiref模塊5、動靜態網頁6、后端獲取當前時間展示到html頁面上7、字典數據傳給html文件8、數據從數據庫中獲取的展示到…

【筆記】CentOS7部署K8S集群

一、初始化(所有節點機器都要執行) 1. 關閉firewall防火墻 systemctl disable firewalld.service systemctl stop firewalld.service2. 關閉SELinux 臨時關閉 setenforce 0永久關閉 vim /etc/selinux/config SELINUXenforcing 改成 SELINUXdisable…

Ethan獨立開發產品日報 | 2025-04-22

1. Agent Simulate 用數千個數字人來測試你的人工智能應用。 Agent Simulate 讓你在發布之前,能夠在一個安全的環境中模擬和測試大型語言模型(LLM)代理。它幫助你調試行為、加快迭代速度,并降低生產風險,專為代理開發…

Photoshop安裝與配置--簡單攻略版

下載地址:Photoshop軟件工具下載 安裝完成后,即可運行Photoshop.exe;打開工具頁面后,按照下面簡單配置即可 1.編輯-》首選項-》常規 或者直接快捷鍵CtrlK 暫存盤:一定要設置為非C盤 2.性能 3.文件處理 以上配置比較基礎&#xf…

新手村:正則化

機器學習-正則化方法 新手村:正則化 什么是正則化? 正則化(Regularization) 是一種用于防止機器學習模型 過擬合(Overfitting)的技術。它通過在模型的 損失函數 中添加一個 懲罰項(Penalty Ter…

C語言 ——— 分支循環語句

目錄 分支循環語句 單分支 多分支 switch 分支語句 牛刀小試 判斷一個數是否是奇數 輸出 1-100之間 的奇數 計算 n 的階乘 計算 1! 2! 3! ... n! 在一個有序數組中查找具體的某一個數字 打印 100-200 之間的素數 求兩個整數的最大公約數 getchar函數 和 putc…