備忘錄模式(Memento Pattern)

定義

備忘錄模式(Memento Pattern)是一種行為設計模式,它允許在不破壞封裝性的前提下捕獲一個對象的內部狀態,并在以后將對象恢復到該狀態。備忘錄模式通常用于實現撤銷操作(Undo)或歷史記錄(History)等功能。

在備忘錄模式中,我們定義三個角色:

  1. Originator:記錄當前時刻它的內部狀態,并可使用備忘錄對象恢復到之前的狀態。
  2. Memento:負責存儲Originator對象的內部狀態,并可防止Originator以外的對象訪問備忘錄。
  3. Caretaker:負責保存好備忘錄對象,不能對備忘錄的內容進行操作或檢查。

示例

下面是一個C++的備忘錄模式示例:

#include <iostream>  
#include <string>  
#include <vector>  // Memento類,存儲Originator的內部狀態  
class Memento {  
public:  std::string state; // 假設Originator有一個string類型的狀態  // 構造函數,用于從Originator獲取狀態  Memento(const std::string& state) : state(state) {}  
};  // Originator類,負責創建Memento,并可以使用Memento恢復狀態  
class Originator {  
private:  std::string state; // Originator的內部狀態  public:  // 獲取當前狀態  std::string getState() const {  return state;  }  // 設置狀態  void setState(const std::string& newState) {  state = newState;  std::cout << "Originator state changed to: " << state << std::endl;  }  // 創建Memento對象,保存當前狀態  Memento* createMemento() {  return new Memento(state);  }  // 使用Memento恢復狀態  void restoreMemento(const Memento* memento) {  state = memento->state;  std::cout << "Originator state restored to: " << state << std::endl;  }  
};  // Caretaker類,負責保存Memento對象  
class Caretaker {  
private:  std::vector<Memento*> mementos; // 存儲Memento對象的容器  public:  // 添加Memento到容器中  void addMemento(Memento* memento) {  mementos.push_back(memento);  }  // 獲取Memento對象,用于恢復狀態  Memento* getMemento(int index) {  if (index >= 0 && index < mementos.size()) {  return mementos[index];  }  return nullptr;  }  
};  int main() {  Originator* originator = new Originator();  Caretaker* caretaker = new Caretaker();  // 設置Originator的初始狀態  originator->setState("Initial State");  // 保存當前狀態到Caretaker  caretaker->addMemento(originator->createMemento());  // 修改Originator的狀態  originator->setState("Modified State");  // 使用Caretaker中的Memento恢復Originator的狀態  originator->restoreMemento(caretaker->getMemento(0));  // 清理資源  delete originator;  delete caretaker;  return 0;  
}

在這個示例中:

  • Memento?類存儲了?Originator?的內部狀態,即一個字符串?state
  • Originator?類有一個私有成員?state,并提供了?setState?和?getState?方法來修改和獲取這個狀態。它還提供了?createMemento?方法來創建一個包含當前狀態的?Memento?對象,以及?restoreMemento?方法來根據?Memento?對象恢復狀態。
  • Caretaker?類負責保存?Memento?對象,并提供?addMemento?和?getMemento?方法來添加和獲取?Memento?對象。

在?main?函數中,我們創建了一個?Originator?對象和一個?Caretaker?對象。我們首先設置了?Originator?的初始狀態,并將這個狀態保存到?Caretaker?中。然后我們修改了?Originator?的狀態,并使用?Caretaker?中保存的?Memento?對象來恢復?Originator?的狀態。

這個示例展示了如何使用備忘錄模式來保存和恢復對象的狀態。在實際應用中,備忘錄模式常用于實現撤銷操作、歷史記錄、事務處理等需要保存和恢復對象狀態的功能。

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

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

相關文章

藍橋杯(3.3)

1208. 翻硬幣 import java.util.Scanner;public class Main {public static void turn(char[] a,int i) {if(a[i] *) a[i] o;else a[i] *;}public static void main(String[] args) {Scanner sc new Scanner(System.in);char[] a sc.next().toCharArray();char[] b sc.n…

python如何設置虛擬環境|方法有哪幾種

原文連接&#xff1a; python設置虛擬環境- Python學習導航 為什么需要虛擬環境&#xff1f; 在使用Python語言時&#xff0c;通過pip&#xff08;pip3&#xff09;來安裝第三方包&#xff0c;但是由于pip的特性&#xff0c;系統中只能安裝每個包的一個版本。但是在實際項目開…

c++之旅——第三彈

大家好啊&#xff0c;這里是c之旅第三彈&#xff0c;跟隨我的步伐來開始這一篇的學習吧&#xff01; 如果有知識性錯誤&#xff0c;歡迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 創作不易&#xff0c;希望大家多多支持哦&#xff01; 一.命名空間;…

項目設計:基于Qt和百度AI的車牌識別系統(嵌入式ARM)

基于Qt和百度AI智能云實現的智能車牌識別系統&#xff0c;具體可實現為停車場管理系統、智能計費停車系統…等。 1.系統實現思路及框架 1.1實現思路 要實現一個車牌識別系統&#xff0c;有多種方法&#xff0c;例如用opencv圖像算法實現&#xff0c;或用第三方算法接口&#x…

輸出梯形 C語言

解析&#xff1a;這個輸出圖形的題就是一個找規律加數學計算&#xff0c;我們發現每行比上一行多兩個*&#xff0c;最后一行的*表達式為h&#xff08;h-1&#xff09;*2&#xff0c;即3*h-2&#xff0c;那么每一行就是一個先輸出最后一行&#xff0d;當前行*個數個空格&#xf…

pytorch 圖像數據集管理

目錄 1.數據集的管理說明 2.數據集Dataset類說明 3.圖像分類常用的類 ImageFolder 1.數據集的管理說明 pytorch使用Dataset來管理訓練和測試數據集&#xff0c;前文說過 torchvision.datasets.MNIST 這些 torchvision.datasets里面的數據集都是繼承Dataset而來&#xff0c…

【Qt】QTextEdit/QPlainTextEdit 實現 Tab 鍵多行縮進與反縮進

【Qt】QTextEdit/QPlainTextEdit 實現 Tab 鍵多行縮進與反縮進 文章目錄 I - 主要原理II - 代碼實現2.1 - 自定義類2.2 - 實現 Tab 縮進2.3 - 實現反縮進III - 參考鏈接I - 主要原理 由于 QTextEdit 和 QPlainTextEdit ,都無法實現多行選中縮進與反縮進,選中多行后,按下縮進…

[Redis]——Redis命令手冊set、list、sortedset

&#x1f333;List類型常見命令 LPUSH / RPUSH [KEY] [element] …… 向列表左側或者右側插入一個或多個元素 LPOP / RPOP [key] 刪除左邊或者右邊第一個元素 LRANGE [key] start end 返回索引start到end的元素&#xff08;索引從0開始&#xff09; BLPOP / BRPOP [key] [等…

【C++】類的默認成員函數(上)

&#x1f525;博客主頁&#xff1a; 小羊失眠啦. &#x1f3a5;系列專欄&#xff1a;《C語言》 《數據結構》 《C》 《Linux》 《Cpolar》 ??感謝大家點贊&#x1f44d;收藏?評論?? 文章目錄 一、默認成員函數二、構造函數構造函數的概念及特性 三、析構函數析構函數的特性…

續簡單學生管理系統、包裝類--day18

Day18 一、刪除的思考題 思考題&#xff1a;刪除功能可以省略第一步嗎&#xff1f;不可以 有第一步判斷學生信息合法性&#xff0c;如果信息不合法會直接結束返回 如果沒有第一步&#xff0c;將會在第二步判斷是否有該學生query循環匹配查找&#xff0c;數據量大情況&#xff…

藍橋杯倒計時 43天 - 前綴和,單調棧

最大數組和 算法思路&#xff1a;利用前綴和化簡 for 循環將 n^2 簡化成 nn&#xff0c;以空間換時間。枚舉每個 m&#xff0c;m是刪除最小兩個數&#xff0c;那k-m就是刪除最大數&#xff0c;m<k&#xff0c;求和最大的值。暴力就是枚舉 m-O(n)&#xff0c;計算前 n-(k-m)的…

PCSA時鐘控制集成之時鐘門控級別

這一部分描述了&#xff1a; ? 時鐘門控的級別。 ? 實現最大效果的時鐘門位置。 ? 實現有效和高效時鐘門控的集成方法。 時鐘樹是由時鐘緩沖器構建的&#xff0c;這些緩沖器在時鐘源&#xff08;時鐘輸入或PLL&#xff09;與時鐘終端&#xff08;寄存器或RAM&#xff09…

ULN2003(COM的作用)

單路內部電路原理圖 三極管多級放大電路&#xff0c;最大可達到500ma&#xff1b; 典型應用&#xff1a; ULN2003屬于灌電流驅動方式&#xff1b;輸入與輸出電平反向&#xff0c;下拉4K電阻&#xff0c;為解決單片機上電IO瞬間不穩定&#xff1b; COM端 1.可懸空&#xff1a…

Java面題總結7

spring事務什么時候會失效 1:發生自調用&#xff0c;類里面使用this調用本類的方法&#xff08;&#xff09;此時這個this對象不是代理類&#xff0c;而是UserService對象本身 2&#xff1a;方法不是public 3&#xff1a;數據庫不支持事務 4&#xff1a;沒有被spring管理 …

git標簽操作

一.標簽管理 1.理解標簽 標簽 tag &#xff0c;可以簡單的理解為是對某次 commit 的?個標識&#xff0c;相當于起了?個別名,當我們需要回退到某個重要版本時&#xff0c;直接使?標簽就能很快定位到 2.創建標簽 ?先&#xff0c;切換到需要打標簽的分?上,然后&#xf…

經典目標檢測網絡Yolo——原理部分

目標檢測問題 分為兩個子問題: 找到圖片中哪些位置、哪些區域含有目標對象識別這些區域中的目標對象是什么基于CNN的目標檢測算法能夠很好的解決第二個問題,在一張圖片僅含一個對象,且該對象占據了整張圖片絕大部分面積時,基于CNN的對象識別算法具有很高的準確率。 一種定…

操作系統(1)——學習導論(Ⅱ)

目錄 小程一言專欄鏈接: [link](http://t.csdnimg.cn/6grrU) 學習導論&#xff08;Ⅱ&#xff09;操作系統-賞前人佳作大型操作系統大型操作系統的一些特點和功能舉例 服務器操作系統服務器操作系統特點和功能舉例 多處理器操作系統舉例 個人計算機操作系統舉例 掌上計算機操作…

什么是ACID屬性。在MySQL中,如何使用事務?給出一個使用事務的示例,并解釋其工作原理。

解釋什么是ACID屬性 ACID是數據庫事務正確執行的四個基本要素的縮寫&#xff0c;包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔離性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;。這四個屬性…

設計模式:什么是設計模式?①

一、什么是設計模式&#xff1f; 1. 是一類程序設計思想 2. 是在大量實踐過程中摸索總結出的標準經驗提煉 3. 具有多樣性和豐富性&#xff0c;不同情況應用的思想不同 二、設計模式的好處 1. 代碼生產力和效率的提升 2. 讓代碼表現更為規整&#xff0c;簡潔。閱讀維護管理的成本…

【競技寶】DOTA2-夢幻聯賽S22:AR命懸一線 XG確定晉級淘汰賽

北京時間2024年2月28日&#xff0c;DOTA2夢幻聯賽S22的比賽在昨日進入小組賽第三個比賽日&#xff0c;本次夢幻聯賽共有AR、XG、IG三支中國區的隊伍參賽&#xff0c;那么經過三日激烈的比賽之后&#xff0c;目前三支隊伍的積分情況以及晉級形勢如何呢&#xff1f; XG XG是小組…