設計模式--備忘錄模式

備忘錄模式是一種行為設計模式,它用于在不破壞封裝的前提下,保存一個對象的內部狀態,以便以后可以恢復到這個狀態。這種模式在許多應用場景中非常有用,例如在實現撤銷操作、保存游戲進度、恢復文件備份以及保持工作狀態等。

備忘錄模式的應用場景

  1. 實現撤銷操作:當需要實現撤銷功能時,可以使用備忘錄模式來保存操作的狀態,以便在需要時可以恢復到之前的某個狀態。
  2. 保存游戲進度:當需要保存游戲進度以便玩家可以在稍后繼續游戲時,可以使用備忘錄模式來保存游戲狀態。
  3. 恢復文件備份:當需要備份文件,并在需要時可以恢復到備份狀態時,可以使用備忘錄模式來保存文件的狀態。
  4. 保持工作狀態:當需要保存應用程序的狀態,以便在需要時可以恢復到之前的工作狀態時,可以使用備忘錄模式來保存狀態。

使用技巧與注意事項

  1. 定義備忘錄接口:為了使用備忘錄模式,需要定義一個備忘錄接口,該接口包含保存和恢復狀態的方法。
  2. 避免濫用:如果對象的狀態變化不是很重要,可能不需要使用備忘錄模式,直接保存對象的狀態即可。

C++代碼示例

下面是一個使用C++編寫的備忘錄模式示例代碼:

#include <iostream>
#include <string>
// 備忘錄接口
class Memento {
public:virtual ~Memento() {}
};
// 具體備忘錄類
class ConcreteMemento : public Memento {
private:std::string state;
public:ConcreteMemento(std::string state) : state(state) {}std::string getState() {return state;}
};
// 發起者類
class Originator {
private:std::string state;
public:void setState(std::string state) {this->state = state;}std::string getState() {return state;}Memento* createMemento() {return new ConcreteMemento(state);}void setMemento(Memento* memento) {state = static_cast<ConcreteMemento*>(memento)->getState();}
};
// 備忘錄管理者類
class Caretaker {
private:Memento* memento;
public:void setMemento(Memento* memento) {this->memento = memento;}Memento* getMemento() {return memento;}
};
int main() {Originator* originator = new Originator();originator->setState("State 1");std::cout << "Originator's state: " << originator->getState() << std::endl;Caretaker* caretaker = new Caretaker();caretaker->setMemento(originator->createMemento());originator->setState("State 2");std::cout << "Originator's state: " << originator->getState() << std::endl;originator->setMemento(caretaker->getMemento());std::cout << "Originator's state after restoring: " << originator->getState() << std::endl;delete originator;delete caretaker;return 0;
}

在這個示例中,我們定義了一個備忘錄接口 Memento,它聲明了保存和恢復狀態的方法。具體備忘錄類 ConcreteMemento 實現了這些方法,并保存了狀態。發起者類 Originator 提供了設置和獲取狀態的方法,并創建了一個備忘錄對象。備忘錄管理者類 Caretaker 負責設置和獲取備忘錄對象。客戶端代碼首先創建發起者對象,然后創建備忘錄管理者對象,并保存狀態。通過這個示例,我們可以看到備忘錄模式在C++中的實現。
總之,備忘錄模式是一種非常有用的設計模式,它可以幫助我們保存對象的狀態,并在需要時可以恢復到之前的狀態。在實際開發中,我們需要根據具體的應用場景來選擇是否使用備忘錄模式,并注意相關的使用技巧和注意事項。

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

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

相關文章

linux中ansible整理筆記

一、工作模式 1. adhoc臨時命令 語法&#xff1a; ansible 主機或者組列表 -m 模塊 -a “參數” 2. playbook 語法&#xff1a; ansible-playbook xxx.yml 二、模塊 1. ping 2.command:默認模塊&#xff08;不支持重定向&#xff0c;管道&#xff09; 3.shell:類似com…

IP地址顯示“不安全”怎么辦|已解決

解決IP地址顯示“不安全”的問題&#xff0c;通常需要確保網站或服務使用HTTPS協議進行加密通信&#xff0c;可以通過部署SSL證書來解決&#xff0c;以下是具體的解決步驟&#xff1a; 1 申請IP地址SSL證書&#xff1a;網站管理員應向證書頒發機構&#xff08;CA&#xff09;申…

網絡拓撲—WEB-IIS服務搭建

文章目錄 WEB-IIS服務搭建網絡拓撲配置網絡IISPC 安裝IIS服務配置IIS服務&#xff08;默認站點&#xff09;PC機訪問網頁 配置IIS服務&#xff08;新建站點&#xff09;PC機訪問網頁 WEB-IIS服務搭建 網絡拓撲 //交換機忽略不計 IIS服務IP&#xff1a;192.168.1.1 PC機IP&…

人類交互2 聽覺處理和語言中樞

人類聽覺概述 人類聽覺是指通過耳朵接收聲音并將其轉化為神經信號&#xff0c;從而使我們能夠感知和理解聲音信息的能力。聽覺是人類五種感覺之一&#xff0c;對我們的日常生活和交流至關重要。 聽覺是人類交流和溝通的重要工具。通過聽覺&#xff0c;我們能夠聽到他人的語言…

安裝錯誤提示Please run MaterialLibrary2018.msi first或者其他MaterialLibrary版本

打開autoremove&#xff0c;系統檢查&#xff0c;點擊開始檢查。檢查完成修復。 可以解決部分該問題&#xff0c;如果沒解決的請咨詢

Linux中的文件描述符

1.系統調用接口和庫函數的關系 函數&#xff1a;fopen fclose fread fwrite 都是c標準庫當中的函數&#xff0c;也就是用戶操作接口中ibc系統調用&#xff1a;open close read write 都是系統調用提供的接口 c語言中接口底層封裝的都是系統調用接口 FILE* stdin stdout stderr…

[POI2008] STA-Station/洛谷P3478(樹形dp)

[ P O I 2008 ] S T A ? S t a t i o n ( 樹形 d p ) \Huge{[POI2008] STA-Station(樹形dp)} [POI2008]STA?Station(樹形dp) 題目鏈接&#xff1a;[P3478 POI2008] STA-Station - 洛谷 文章目錄 題意思路標程 題意 給定一個 n n n個點的樹&#xff0c;請求出一個結點&#…

js無感刪除url搜索部分,不刷新頁面

如&#xff1a;把下面的網址 http://127.0.0.1:5173/?code3b9cc36e&state 改成 http://127.0.0.1:5173 history.pushState(null, 網站標題, location.origin)

TikTok越獄檢測之二 <調試器檢測>

來了&#xff0c;調試器檢測。總結如下,多多指教: 檢測app 是否被附加調試: 原理就是檢測父進程是否 launchd啟動&#xff0c;在OS X和iOS 系統中&#xff0c;用戶環境始于launchd&#xff0c;為用戶態出現的第一個進程&#xff0c;為所有的進程的祖先&#xff0c;launchd 的進…

Python模塊、包和異常處理

大家好&#xff0c;在當今軟件開發領域&#xff0c;Python作為一種簡潔、易讀且功能強大的編程語言&#xff0c;被廣泛應用于各種領域。作為一名測試開發工程師&#xff0c;熟練掌握Python的模塊、包和異常處理是提高代碼可維護性和錯誤處理能力的關鍵。本文將和大家一起探討Py…

SAP-MRP和采購申請

1、如果采購申請是手工創建的,跑MRP會不會被覆蓋? 創建一個采購申請18089476,然后運行MRP-MD03,再用MD04查看下 從上圖看,手工創建的采購申請被打上*號,沒有被覆蓋掉。 2、如果采購申請被審批了,會不會被覆蓋掉? 首先創建一個獨立需求MD61 然后庫存消耗掉為0,運行M…

shell實現ssh服務防止暴力破解 —— 筑夢之路

實現原理 對系統登陸日志文件/var/log/secure&#xff0c;進行數據篩選&#xff0c;查找登陸失敗的ip地址&#xff0c;然后將ip加入到黑名單中。 腳本內容 #!/bin/bash# 獲取登陸失敗的ip地址failedcat /var/log/secure|grep "Failed"|awk {print $11}|sort|uniq …

普源精電收購耐數電子——用“鈔能力”拿下“量子”?

「量子市界」聚焦量子前沿&#xff0c;揭秘市場動態┃2024年4月30日&#xff0c;普源精電新增“量子科技”概念。 似乎一夜之間&#xff0c;新增“量子科技”概念的上市企業如雨后春筍般登場——普源精電就是其一。普源精電本就持有耐數電子32.26%股權&#xff0c;于4月2日發布…

c4d云渲染是工程文件會暴露嗎?

在數字創意產業飛速發展的今天&#xff0c;C4D云渲染因其高效便捷而備受歡迎。然而&#xff0c;隨著技術應用的深入&#xff0c;人們開始關注一個核心問題&#xff1a;在享受云渲染帶來的便利的同時&#xff0c;C4D工程文件安全嗎&#xff1f;是否會有暴露的風險&#xff1f;下…

【如何讓論文中摘要后面的內容不出現在目錄中】

首先選擇摘要二字&#xff0c;設置為一級標題&#xff0c;然后選擇摘要后面的內容設置為正文樣式&#xff0c;再選擇這一部分看一下是不是都是正文大綱級別&#xff0c;如果是那就可以了。 具體流程如下 1、選擇摘要二字&#xff0c;設置為一級標題樣式 2、選擇摘要后面的文…

x264 碼率控制原理:rate_estimate_qscale 函數

rate_estimate_qscale 函數 原理 函數功能:根據目前使用的實際比特數更新一幀的qscale;是一個復雜的決策過程,需要考慮多種因素,如幀類型、編碼的復雜度、目標比特率、緩沖區大小等,以確保視頻質量和文件大小之間的平衡。函數參數分析:x264_t *h :編碼器上下文信息結構…

擴散模型學習1

DDPM 總體訓練原理 https://www.bilibili.com/video/BV1nB4y1h7CN/?spm_id_from333.337.search-card.all.click&vd_sourcef745c116402814185ab0e8636c993d8f 講得很好&#xff1a;每次都是輸入t和noise-x的圖像&#xff0c;預測noise之后得到和加入的noise比較&#xff1b…

LLM實戰:當網頁爬蟲集成gpt3.5

1. 背景 最近本qiang~關注了一個開源項目Scrapegraph-ai&#xff0c;是關于網頁爬蟲結合LLM的項目&#xff0c;所以想一探究竟&#xff0c;畢竟當下及未來&#xff0c;LLM終將替代以往的方方面面。 這篇文章主要介紹下該項目&#xff0c;并基于此項目實現一個demo頁面&#x…

Java并發: 鎖和同步

在Java并發: 面臨的挑戰那一篇中我們提到鎖和同步是實現并發安全(可見性/原子性)的方法之一。這一章我們來講講Java中的鎖和同步的各種工具&#xff0c;包括: LockSupportAbstractQueuedSynchronizerJava內置的鎖實現 1. LockSupport LockSupport是基于Unsafe的park/unpark實…

智能禁區監控:計算機視覺在人員禁區闖入檢測中的應用

基于視覺分析的人員禁區闖入行為檢測算法主要依賴于計算機視覺技術和深度學習算法。這些技術結合高性能的攝像頭和圖像處理硬件&#xff0c;實現了對監控區域內人員行為的自動識別和分析。具體來說&#xff0c;這種檢測算法利用攝像頭捕捉的視頻數據&#xff0c;通過深度學習模…