23種設計模式-備忘錄(Memento)設計模式

備忘錄設計模式

  • 🚩什么是備忘錄設計模式?
  • 🚩備忘錄設計模式的特點
  • 🚩備忘錄設計模式的結構
  • 🚩備忘錄設計模式的優缺點
  • 🚩備忘錄設計模式的Java實現
  • 🚩代碼總結
  • 🚩總結

🚩什么是備忘錄設計模式?

備忘錄設計模式(Memento Pattern) 是一種 行為型設計模式,用于在不破壞對象封裝性的前提下,捕獲對象的內部狀態,并在未來的某個時間點恢復到該狀態。該模式可以幫助我們實現 撤銷(Undo) 操作,常用于文本編輯器、事務管理等場景。

使用場景

  • 需要 保存和恢復對象的狀態,比如 撤銷/重做 功能

  • 需要 防止外部對象直接訪問對象的私有狀態,保持封裝性

  • 需要 在歷史記錄中存儲對象的多個狀態,支持回溯

🚩備忘錄設計模式的特點

  • 封裝性:對象的狀態被存儲在備忘錄中,避免外部訪問

  • 狀態恢復:允許對象恢復到之前的狀態,支持回溯操作

  • 簡化歷史記錄管理:可以存儲多個歷史狀態,支持撤銷、重做等功能

  • 解耦設計:原發器(Originator)與管理者(Caretaker)解耦,原發器只負責創建和恢復狀態,管理者負責存儲

🚩備忘錄設計模式的結構

備忘錄模式主要包含以下部分:

  • Originator(原發器):負責創建備忘錄(Memento)并存儲當前狀態,支持從備忘錄恢復狀態

  • Memento(備忘錄):存儲原發器的狀態,并提供恢復該狀態的方法

  • Caretaker(管理者):負責存儲多個備忘錄對象,可以提供回溯功能

圖例:在這里插入圖片描述

🚩備忘錄設計模式的優缺點

? 優點

  • 封裝性好,外部對象無法直接訪問對象的狀態

  • 支持撤銷和重做功能,適用于編輯器、事務管理等場景

  • 解耦原發器和管理者,增強了代碼的可維護性

? 缺點

  • 內存消耗大,如果存儲大量狀態,可能會影響系統性能

  • 狀態存儲復雜,如果對象的狀態較大,存儲和恢復的成本較高

🚩備忘錄設計模式的Java實現

代碼地址:GitHub

  • 創建 Memento(備忘錄) 類
/*** @author hanson* @description: 備忘錄* @date 2025-03-25 22:57:26* @version: 1.0*/
public class Memento {// 備忘錄private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}
  • 創建Originator(原發器)
/*** @author hanson* @description: 原發器* @date 2025-03-25 22:56:35* @version: 1.0*/
public class Originator {// 原發器private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento createMemento() {return new Memento(state);}public void setMemento(Memento memento) {state = memento.getState();}
}
  • 創建Caretaker(管理者)
/*** @author hanson* @description: 管理者* @date 2025-03-25 22:58:35* @version: 1.0*/
public class Caretaker {// 管理者private List<Memento> mementoList = new ArrayList<>();public void addMemento(Memento state) {mementoList.add(state);}public Memento getMemento(int index) {// 判斷參數是否合法if (index >= 1 && index <= mementoList.size()) {return mementoList.get(index - 1);}return null;}public void showMemento() {int cnt = 1;// for (遍歷對象類型 對象名 : 遍歷對象)for (Memento memento : mementoList) {System.out.println("第" + cnt + "次備份,狀態為:" + memento.getState());cnt++;}}
}
  • 測試備忘錄模式
/*** @author hanso* @description: 測試備忘錄模式* @date 2025-03-25 23:00:25* @version: 1.0*/
public class MementoPattern {public static void main(String[] args) {Caretaker caretaker = new Caretaker();Originator originator = new Originator();originator.setState("1024");Memento backup1 = originator.createMemento();caretaker.addMemento(backup1);originator.setState("2048");Memento backup2 = originator.createMemento();caretaker.addMemento(backup2);originator.setState("4096");Memento backup3 = originator.createMemento();caretaker.addMemento(backup3);System.out.println(originator.getState());caretaker.showMemento();Memento memento1 = caretaker.getMemento(2);originator.setMemento(memento1);System.out.println("根據第2次備份還原之后的狀態為:" + originator.getState());}
}

📌 運行結果

在這里插入圖片描述

🚩代碼總結

  • Originator(原發器):負責創建備忘錄,并存儲和恢復狀態

  • Memento(備忘錄):存儲狀態,不對外暴露內部信息

  • Caretaker(管理者):管理多個備忘錄對象,提供狀態回溯功能

  • 支持多次狀態存儲與回溯,可用于撤銷/重做功能

🚩總結

  • 備忘錄設計模式 適用于 狀態恢復撤銷/重做 等場景

  • 解耦設計,原發器與管理者獨立,避免外部訪問對象狀態

  • 支持歷史記錄管理,但需要注意 內存消耗問題

  • 廣泛應用 于 文本編輯器事務管理游戲存檔

? Java源碼中的應用場景:

  1. 數據庫事務管理:

    • 事務回滾(Rollback)

    • 事務日志(Transaction Log)

  2. Spring 事務管理(TransactionManager):

    • 通過事務日志(Transaction Log)來支持回滾

創作不易,不妨點贊、收藏、關注支持一下,各位的支持就是我創作的最大動力??

在這里插入圖片描述

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

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

相關文章

利用虛擬化技術實現高級Hook

虛擬化技術為系統監控和Hook提供了更強大、更隱蔽的實現方式。以下是幾種基于虛擬化的Hook技術實現方法&#xff1a; 1. 基于VT-x/AMD-V的硬件虛擬化Hook 基本原理 利用CPU的硬件虛擬化擴展(Intel VT-x/AMD-V)在Ring -1層級監控系統行為&#xff0c;實現無法被常規方法檢測的…

某魚、某寶 sign 簽名算法分析記錄

【作者主頁】&#xff1a;小魚神1024 【知識星球】&#xff1a;小魚神的逆向編程圈 【擅長領域】&#xff1a;JS逆向、小程序逆向、AST還原、驗證碼突防、Python開發、瀏覽器插件開發、React前端開發、NestJS后端開發等等 本文章中所有內容僅供學習交流使用&#xff0c;不用于其…

Compose筆記(十三)--事件總線

這一節了解一下Compose中的事件總線&#xff0c;在Jetpack Compose里&#xff0c;官方沒有直接提供事件總線&#xff0c;但可以借助第三方庫或者自定義實現來達成事件總線的功能&#xff0c;進而在不同的 Compose 控件間同步數據。 自定義事件總線 import androidx.compose.r…

Python的inspect模塊

在Python編程中&#xff0c;**inspect**模塊是一個強大的工具包&#xff0c;它提供了一系列函數來獲取對象的信息&#xff0c;主要用于獲取對象的源代碼、參數信息、類繼承關系、方法屬性等。這對于調試、自動化文檔生成、代碼分析等場景都非常有用。本文將詳細介紹inspect模塊…

2025跳槽學習計劃

&#xff08;1&#xff09;編程基礎&#xff1a; 目錄學習資料Chttps://www.bilibili.com/video/BV1z64y1U7hs?spm_id_from333.1387.favlist.content.clickLinuxPytorchhttps://www.bilibili.com/video/BV1if4y147hS?spm_id_from333.1387.favlist.content.clickopencv數據結…

WebRTC簡介及應用

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一種支持瀏覽器和移動設備進行實時音視頻通信的技術&#xff0c;無需安裝插件或額外的軟件。它是一個開放標準&#xff0c;最初由Google推動&#xff0c;并被W3C&#xff08;萬維網聯盟&#xff09;和IETF&#xf…

【C語言】分支與循環(上)

前言&#xff1a;C語言是由順序結構、選擇結構、循環結構組成的結構化的程序設計語言。 那C語言是如何設計和實現這些結構的呢&#xff1f;話不多說&#xff0c;馬上開始。 三種結構如圖所示&#xff1a; 我們可以使用 if else語句、 switch語句 來實現選擇&#xff08;分支&am…

一次與chatgpt關于VO的深入討論。

我&#xff1a; {"usageRate":50,"projectInfo":[{"productName":"長江一號","deviceInfo":[{"deviceName":"AA","num":10},{"deviceName":"BB","num":3}]},…

Springboot學習筆記3.20

目錄 1.實戰篇第一課 我們將會在本次實戰中學習到哪些知識點&#xff1f; 開發模式和環境搭建&#xff1a; 注冊接口 1.Lombok 2.開發流程 1.controller層&#xff0c;這個層會指明訪問路徑和要執行的邏輯&#xff1a; 2.我們把返回結果根據接口文檔包裝成一個類result&a…

docker save如何遷移鏡像更節省空間?

文章目錄 方法一&#xff1a;使用docker save命令方法二&#xff1a;直接保存多個鏡像到一個tar文件哪個方法更節省磁盤空間&#xff1f;空間效率對比實際測試示例其他優勢結論 如何用腳本遷移加載鏡像 遷移鏡像時候&#xff0c;往往會碰到基礎鏡像相同的很多鏡像需要遷移&…

全新升級 | Built For You Spring ‘25 發布,Fin 智能客服實現新突破!

圖像識別、語音交互、任務自動化&#xff0c;立即體驗智能客服蛻變&#xff01; 上周&#xff0c;Intercom 舉辦了 Built For You Spring 25 發布會&#xff0c;正式揭曉了 AI Agent Fin 的一系列令人振奮的更新。Fin 正在以前所未有的速度革新客戶支持模式——它已經成功解決了…

需求導向的K8S網絡原理分析:Kube-proxy、Flannel、Calico的地位和作用

最近發現自己似乎從來沒學明白過Kubernetes網絡通信方案&#xff0c;特開一貼復習總結一下。 在k8s中&#xff0c;每個 Pod 都擁有一個獨立的 IP 地址&#xff0c;而且假定所有 Pod 都在一個可以直接連通的、扁平的網絡空間中。所以不管它們是否允許在同一個 Node&#xff08;宿…

Vulnhub:Digitalword.local: FALL靶機滲透

將靶機按照圖中連接方式打開&#xff0c;fall在virtualBox中打開 信息收集 掃描得ip arp-scan -l 掃描端口 nmap -A -T4 -sV -p- 掃描目錄 gobuster dir -u http://192.168.117.160 -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 一個一個…

4、網工軟考—VLAN配置—hybird配置

1、實驗環境搭建&#xff1a; 2、實驗過程 SW1&#xff1a; 先創建vlan2和vlan3 [Huawei-Ethernet0/0/2]port link-type hybrid //hybird端口 [Huawei-Ethernet0/0/2]port hybrid pvid vlan 2 [Huawei-Ethernet0/0/2]port hybrid untagged vlan 10 //撕掉vlan10的標簽 …

【OCR】技術

OCR圖像識別 一、OCR是什么二、Python中如何實現OCR1.簡單應用 三、OCR的核心步驟1.?圖像預處理?&#xff08;提高識別準確率&#xff09;2.?文字識別3.?輸出結果 四、OCR到的應用場景五、注意事項六、擴展學習 此貼用來更新在工作中遇到的一些圖片解析內容 一、OCR是什么 …

深入理解 dispatchEvent:前端事件觸發的藝術

dispatchEvent 是 DOM 元素的一個方法&#xff0c;用于手動觸發/派發一個事件。這個方法允許開發者以編程方式觸發事件&#xff0c;而不是等待用戶交互或瀏覽器自動觸發。 1.基本概念 作用&#xff1a;dispatchEvent 用于在指定的 DOM 節點上觸發一個事件 使用場景&#xff1…

2025年數智化電商產業帶發展研究報告260+份匯總解讀|附PDF下載

原文鏈接&#xff1a;https://tecdat.cn/?p41286 在數字技術與實體經濟深度融合的當下&#xff0c;數智化產業帶正成為經濟發展的關鍵引擎。 從云南鮮花產業帶的直播熱銷到深圳3C數碼的智能轉型&#xff0c;數智化正重塑產業格局。2023年數字經濟規模突破53.9萬億元&#xff…

【深度學習】【目標檢測】【OnnxRuntime】【C++】YOLOV5模型部署

【深度學習】【目標檢測】【OnnxRuntime】【C】YOLOV5模型部署 提示:博主取舍了很多大佬的博文并親測有效,分享筆記邀大家共同學習討論 文章目錄 【深度學習】【目標檢測】【OnnxRuntime】【C】YOLOV5模型部署前言Windows平臺搭建依賴環境模型轉換--pytorch轉onnxONNXRuntime推…

深入解析 JSON-RPC:從基礎到高級應用(附調用示例)

在當今的軟件開發領域&#xff0c;遠程過程調用&#xff08;RPC&#xff09;技術是實現分布式系統間通信的關鍵手段之一。JSON-RPC&#xff0c;作為一種基于 JSON 數據格式的輕量級 RPC 協議&#xff0c;因其簡潔性和高效性而備受青睞。本文將全面深入地探討 JSON-RPC 的核心概…

抽象代數:群論

系列筆記為本學期上抽象代數課整理的&#xff0c;持續更新。 群的相關定義 群的定義 群是一個帶有滿足結合律、單位元、逆元的二元運算的集合&#xff0c;記作 ( G , ? ) \left({G, \cdot}\right) (G,?)。若群運算滿足結合律&#xff0c;則該集合構成半群。如果該半群中含…