Java設計模式之《備忘錄模式》

目錄

1. 概念

1.1、定義

1.2、適用場景

2、角色劃分

3、實現

1、Originator(發起人)

2、Memento(備忘錄)

3、Caretaker(管理者)

4、使用示例

4、優缺點

4.1、優點

4.2、缺點


前言

????????備忘錄模式是一種行為型設計模式,用于在不破壞封裝性的情況下保存和恢復對象的狀態。它包含源發器、備忘錄管理者三個角色。

????????該模式常用于撤銷操作,如文本編輯器的撤銷功能和數據庫事務管理。

????????備忘錄模式雖然有內存占用和性能開銷的缺點,但在需要狀態管理的場景中十分有用。

設計模式分類如下:


1. 概念

1.1、定義

????????備忘錄模式(Memento Pattern))用于在不破壞對象封裝性的前提下,捕獲一個對象的內部狀態,并在需要時恢復這個狀態(如撤銷操作)。

????????即允許對象把當前狀態保存到外部對象中。以后可將其恢復。

1.2、適用場景

1、需要保存和恢復數據場景(如撤銷、歷史快照、存檔、游戲進度、表單編輯器等)。

2、不希望外部對象隨意訪問對象內部細節,但需要保存和恢復快照。


2、角色劃分

如下圖所示:

  • Originator(發起人/原發器):擁有內部狀態,需要保存和恢復
  • Memento(備忘錄):保存Originator的狀態
  • Caretaker(管理者/看護者):保存并管理備忘錄,但不能操作備忘錄內部實現內容


3、實現

1、Originator(發起人)

class Editor {private String text;public void setText(String text) { this.text = text; }public String getText() { return text; }public Memento save() { return new Memento(text); }public void restore(Memento m) { this.text = m.getText(); }
}

2、Memento(備忘錄)

class Memento {private final String text;public Memento(String text) { this.text = text; }public String getText() { return text; }
}

3、Caretaker(管理者)

import java.util.Stack;
class Caretaker {private Stack<Memento> history = new Stack<>();public void add(Memento m) { history.push(m); }public Memento undo() {if (!history.isEmpty()) return history.pop();return null;}
}

4、使用示例

public class Main {public static void main(String[] args) {Editor editor = new Editor();Caretaker caretaker = new Caretaker();editor.setText("第一版");caretaker.add(editor.save());editor.setText("第二版");caretaker.add(editor.save());editor.setText("第三版");// 撤銷到第二版editor.restore(caretaker.undo());System.out.println(editor.getText()); // 輸出 第二版// 再撤銷editor.restore(caretaker.undo());System.out.println(editor.getText()); // 輸出 第一版}
}

4、優缺點

4.1、優點

1、狀態保存與恢復:

????????備忘錄模式可以幫助我們保存對象的狀態,并在需要時恢復到之前的狀態。這在某些情況下非常有用,比如撤銷操作或者程序崩潰后的恢復。

2、封裝性和隔離性:

????????可以確保對象的狀態保存在備忘錄對象中,而不會暴露給其他對象。這為對象的封裝性和隔離性提供了保護,使得對象的狀態變化對其他對象是透明的。


4.2、缺點

1、內存占用:

????????可能引起較大的內存占用,特別是當對象的狀態較多且狀態改變頻繁時。每個備忘錄對象都需要保存一份完整的狀態,如果狀態較多或者備忘錄對象較多,可能會消耗大量內存。

2、性能開銷:

????????備忘錄模式涉及到創建、存儲和恢復狀態的操作,這些操作可能引起一定的性能開銷。特別是在狀態較大或者對象較復雜的情況下,備忘錄模式的性能可能會受到影響。


總結:


參考文章:

1、設計模式(十九)行為型:備忘錄模式詳解-CSDN博客文章瀏覽閱讀443次,點贊19次,收藏21次。備忘錄模式(Memento Pattern)是 GoF 23 種設計模式中的行為型模式之一,其核心價值在于在不破壞封裝性的前提下,捕獲并外部化一個對象的內部狀態,以便在之后能夠將該對象恢復到原先保存的狀態。 https://blog.csdn.net/ZxqSoftWare/article/details/149712206?ops_request_misc=%257B%2522request%255Fid%2522%253A%252299945c753ba5cd13ba1abf9c2213f646%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=99945c753ba5cd13ba1abf9c2213f646&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-149712206-null-null.142^v102^control&utm_term=%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F&spm=1018.2226.3001.4187

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

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

相關文章

SpringBoot 多環境配置

在實際項目開發中&#xff0c;不同環境往往有不同的配置需求&#xff1a; 開發環境&#xff08;dev&#xff09;&#xff1a;本地調試&#xff0c;連接測試數據庫&#xff1b;測試環境&#xff08;test&#xff09;&#xff1a;接口聯調&#xff0c;接近真實場景&#xff1b;生…

延凡智慧醫院數字孿生平臺

延凡智慧醫院數字孿生平臺是延凡科技依托物聯網、數字孿生、AI 算法及邊緣計算技術打造的醫療場景全要素數字化解決方案&#xff0c;通過構建醫院物理實體與虛擬空間的實時映射&#xff0c;實現醫療資源優化、運營效率提升及患者體驗升級。一、平臺價值&#xff08;一&#xff…

談談WebAssembly、PWA、Web Workers的作用和場景

WebAssembly、PWA 和 Web Workers 是現代 Web 開發中提升性能、擴展能力的重要技術&#xff0c;各自解決不同場景的問題&#xff0c;以下結合實際使用經驗分析&#xff1a;一、WebAssembly&#xff08;Wasm&#xff09;&#xff1a;高性能代碼執行作用&#xff1a;WebAssembly …

嵌入式第十八課!!數據結構篇入門及單向鏈表

在前幾章對C語言的學習中&#xff0c;我們學到了&#xff1a;基本的C語法和簡單算法面向過程的編程思想而在數據結構這一篇章&#xff0c;我們將要學習&#xff1a;常用的數據存儲結構算法面向對象的編程思想數據結構在正式開始學習之前&#xff0c;我們先來了解一下什么是數據…

win10任務欄出問題了,原來是wincompressbar導致的

問題描述兄弟們客戶說自己電腦現在有問題了&#xff0c;任務欄顯示的都不對&#xff0c;和之前的都不一樣&#xff0c;現在使用起來非常難受&#xff0c;我們來看一下&#xff0c;這到底是什么問題吧&#xff01;到客戶現場&#xff0c;查看發現&#xff0c;客戶桌面系統最底下…

FFmpegHandler 功能解析,C語言程序化設計與C++面向對象設計的核心差異

FFmpegHandler 功能解析 本文件記錄了關于 FFmpegHandler 類中核心函數工作流程的詳細解釋。Q: FFmpeg逐幀解碼&#xff0c;FFmpegHandler::openVideo 和 FFmpegHandler::readAVFrame 這兩個函數都分別做了什么&#xff1f; A: 可以把整個過程想象成“準備播放一部電影”&#…

Codeforces Round 1039 (Div. 2) A-C

A. Recycling Center題目大意 給你n個垃圾袋&#xff0c;每個垃圾袋有一個重量 在每秒鐘&#xff0c;你可以選擇一個垃圾袋&#xff0c;如果他的重量小于等于c&#xff0c;那么你可以不花費硬幣丟掉它 當你丟掉一個垃圾袋后&#xff0c;其他垃圾袋在這一秒重量會翻倍 問最少花費…

【設計模式】 原則

單一職責原則 對于一個類而言&#xff0c;有且僅有一個引起他變化的原因或者說&#xff0c;一個類只負責一個職責 如果一個類承擔的職責過多&#xff0c;那么這些職責放在一起耦合度太高了&#xff0c;一個職責的變化可能會影響這個類其他職責的能力。 所以我們在做軟件設計的時…

windows11右鍵菜單新增項增加drawio文件,使用draw.io

目錄1.新建空白模板2.建立注冊表文件1.新建空白模板 這里我們的模板文件路徑為 D:\Software\drawio\template.drawio 2.建立注冊表文件 首先新建一個.txt文件&#xff0c;我這里取名為menulize.txt&#xff0c;然后將下面的內容復制到.txt文件中 Windows Registry Editor Ver…

解鎖網頁魔法:零基礎HTML通關秘籍

文章目錄**解鎖網頁魔法&#xff1a;零基礎HTML通關秘籍**HTML 基礎目標HTML 結構認識 HTML 標簽HTML 文件基本結構標簽層次結構快速生成代碼框架HTML 常見標簽注釋標簽注釋的原則標題標簽: h1-h6段落標簽: p換行標簽&#xff1a;br綜合案例: 展示博客超鏈接標簽: a表格標簽**基…

類似 Pixso 但更側重「網頁 / 軟件界面設計」「前后端可視化開發」的工具

從 GoView 的 Demo 功能來看&#xff0c;它主要聚焦于數據可視化大屏的低代碼搭建&#xff0c;更側重數據圖表配置和頁面布局&#xff0c;沒有類似 Pixso 的在線 UI 設計&#xff08;如矢量繪圖、組件樣式精細化設計&#xff09;功能&#xff0c;其核心是通過預設組件快速構建數…

MySQL--組從復制的詳解及功能演練

2.MySQL的組從復制 2.1 配置mastesr [rootmysqlaa ~]# vim /etc/my.cnf [mysqld] server-id10 datadir/data/mysql socket/data/mysql/mysql.sock default_authentication_pluginmysql_native_password log-binmysql-bin[rootmysqlaa ~]# /etc/init.d/mysqld restart# 進入數據…

JavaScript將String轉為base64 筆記250802

JavaScript將String轉為base64 筆記250802 在 JavaScript 中將字符串轉換為 Base64 編碼有多種方法&#xff0c;每種方法都有其適用場景。下面我將全面介紹這些方法&#xff0c;包括處理 ASCII 字符、Unicode 字符以及性能優化方案。 基礎方法&#xff1a;btoa() 基本用法&a…

Unity3D數學第四篇:射線與碰撞檢測(交互基礎篇)

Unity3D數學第一篇&#xff1a;向量與點、線、面&#xff08;基礎篇&#xff09; Unity3D數學第二篇&#xff1a;旋轉與歐拉角、四元數&#xff08;核心變換篇&#xff09; Unity3D數學第三篇&#xff1a;坐標系與變換矩陣&#xff08;空間轉換篇&#xff09; Unity3D數學第…

數據處理和統計分析——09 數據分組

1 聚合 1.1 簡介 在SQL中我們經常使用GROUP BY將某個字段&#xff0c;按不同的取值進行分組&#xff0c;在Pandas中也有groupby()函數&#xff1b;分組之后&#xff0c;每組都會有至少1條數據&#xff0c;將這些數據進一步處理返回單個值的過程就是聚合&#xff0c;比如分組之后…

【數據結構與算法】數據結構初階:排序內容加餐(一)——快速排序:三路劃分、自省排序

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 &#x1f349;學習方向&#xff1a;C/C方向 ??人生格言&#xff1a;為天地立心&#xff0c;為生民立命&#xff0c;為…

MySqL(加餐)

范式第一范式數據庫表的每一列都是不可分割的原子數據項&#xff0c;而不能是集合&#xff0c;數組&#xff0c;對象等非原子數據。在關系型數據庫的設計中&#xff0c;滿足第一范式是對關系模式的基本要求。不滿足第一范式的數據庫就不能被稱為關系數據庫。第一范式實際上只要…

【redis】基于工業界技術分享的內容總結

Redis 實踐指南與核心概念 一、Java 中常用的 Redis 使用場景與實踐 緩存&#xff08;Caching&#xff09; 場景&#xff1a;熱點數據、頻繁訪問的數據&#xff0c;如商品詳情、用戶信息。通過緩存減少數據庫壓力&#xff0c;提高系統響應速度。 工業界實踐&#xff1a; 淘寶…

服務端之nestJS常用異常類及封裝自定義響應模塊

MENU前言常用異常類&#xff08;由nestjs/common提供&#xff09;示例自定義異常&#xff08;可選&#xff09;自定義響應模塊前言 在NestJS中&#xff0c;nestjs/common提供了大量的內置異常類&#xff0c;主要用于在控制器、服務等層拋出特定的HTTP錯誤響應。 常用異常類&…

數據鏈路層、NAT、代理服務、內網穿透

目錄 一. 以太網 以太網幀格式 二. MAC地址 三. MTU 四. ARP協議 五. NAT NAPT 六. 代理服務器 正向代理 反向代理 七. 內網穿透 八. 內網打洞 一. 以太網 ? "以太網" 不是一種具體的網絡, 而是一種技術標準; 既包含了數據鏈路層的內 容, 也包含了一些物理層…