1. 程式人生 > >C++設計模式(1):備忘錄模式

C++設計模式(1):備忘錄模式

這是一系列的文章,在這些文章的開頭會首先介紹這個模式,並稍加討論。然後介紹類圖、結構、以及程式碼。最後對這個模式進行完整的討論,包括適用性、應用場景、優缺點、與其他模式的關係等等。

在我們設計需要撤回的軟體,或者一些遊戲的存檔時,就需要用到備忘錄模式。
備忘錄模式:備忘錄物件是一個用來儲存另外一個物件內部狀態的快照的物件。備忘錄模式的用意是在不破壞封裝的條件下,將一個物件的狀態捉住,並在該物件外部儲存狀態,從而可以在將來合適的時候把這個物件還原到儲存起來的狀態。

備忘錄模式的UML圖如下:
這裡寫圖片描述
該類圖中有以下三個方面:
Memento(備忘錄):儲存原發器物件的內部狀態。原發器根據需要決定備忘錄儲存原發器的哪些內部狀態;防止原發器以外的其他物件訪問備忘錄
Originator(原發器):建立一個備忘錄,用於記錄當前時刻它的內部狀態;使用備忘錄恢復內部狀態
Caretaker(管理者):負責儲存好備忘錄;不能對備忘錄的內容進行操作或檢查

程式碼:

//備忘錄
class Memento
{
public:
    string state;
    Memento(string state) //記錄當前的狀態,
    {
        this->state = state;
    }
};

class Originator
{
public:
    string state;                 
    void setMemento(Memento *memo)      // 通過呼叫Caretaker中相應的備忘錄來恢復狀態
    {
        state = memo->state;    
    }
    Memento *createMemento()          //只有原發器才能向備忘錄存取資訊,備忘錄對其他物件是不可見的
{ return new Memento(state); } void show() { cout << state << endl; } }; //備忘錄的管理器 class Caretaker { public: vector<Memento *> memo; void save(Memento *memo) { (this->memo).push_back(memo); } Memento *getState(int i) { return
memo[i]; } }; int main() { Originator *og = new Originator(); Caretaker *ct = new Caretaker(); og->state = "狀態1"; og->show(); ct->save(og->createMemento()); og->state = "狀態2"; og->show(); ct->save(og->createMemento()); og->state = "狀態3"; og->show(); ct->save(og->createMemento()); og->setMemento(ct->getState(1)); cout << "恢復第2個狀態:"; og->show(); og->setMemento(ct->getState(2)); cout << "恢復第3個狀態"; og->show(); cin.get(); return 0; }

備忘錄模式適用於:
1、必須儲存一個物件在某一時刻的(部分)狀態,這樣以後需要時它才能恢復到先前的狀態。
2、如果一個用介面來讓其他物件直接得到這些狀態,將會暴露物件的實現細節並破壞物件的封裝性。

應用:
設計需要回放的軟體,資料庫備份,文件的撤銷、恢復,遊戲中的存檔等都會用到此模式。

優點:
備忘錄能返回到我們需要的狀態,撤回我們的錯誤。並且備忘錄儲存在原發器之外,原發器只需要建立好備忘錄而不必管理。
缺點:
如果備份的物件存在大量的資訊或者建立、恢復操作非常頻繁,則可能造成很大的效能開銷。因此,備忘錄模式不能用在for迴圈中,不能頻繁建立。

與其他模式的關係:
在命令模式中,如果命令請求可以撤銷的話,那這個功能可以由備忘錄模式來實現。

相關推薦

C++設計模式1備忘錄模式

這是一系列的文章,在這些文章的開頭會首先介紹這個模式,並稍加討論。然後介紹類圖、結構、以及程式碼。最後對這個模式進行完整的討論,包括適用性、應用場景、優缺點、與其他模式的關係等等。 在我們設計需要撤回的軟體,或者一些遊戲的存檔時,就需要用到備忘錄模式。 備忘

23種設計模式15備忘錄模式

create getprop 是個 類型 創建 title pre 定義 當前 定義:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣就可以將該對象恢復到原先保存的狀態 類型:行為類模式。 類圖: 我們在編程的時候,經常需要保存對象的中

設計模式備忘錄模式

備忘錄模式 參考自http://www.runoob.com/design-pattern/memento-pattern.html 備忘錄模式(Memento Pattern)儲存一個物件的某個狀態,以便在適當的時候恢復物件。其實就是給我們需要記錄的資料保留了一個副本,在事務需要回滾的

設計模式1工廠模式

在工廠模式中,我們沒有建立邏輯暴露給客戶端建立物件,並使用一個通用的介面引用新建立的物件。 1.建立Shape介面 public interface Shape { void draw(); } 2.建立多個Shape實現類(這裡建立了3個) public class Rec

java設計模式1命令模式

命令模式在一些需求場景中,有發出命令的物件,有執行命令的物件,有具體的命令。但是如果要將這些模型抽象出來可以複用,這就是常見的命令模式。命令模式中的5個角色(1)呼叫者:負責呼叫命令物件,執行命令物件的方法(2)執行者:具體執行某一方法(3)抽象命令:一個介面或抽象類,讓具體

C#設計模式1——簡單工廠模式

void 例子 代碼復用 操作 inf 這樣的 man ger troy 1.什麽是簡單工廠   現實中的工廠負責生產產品,編程中的簡單工廠顧名思義就是一個生產對象的類,它的主要作用是封裝改變。我們在平時的工作必不可免的和各種數據庫打交道,我們就以一個數據庫服務類為例來分

JAVA設計模式1工廠設計模式

工廠模式是Java中最常用的設計模式之一。 這種型別的設計模式屬於建立模式,因為此模式提供了建立物件的最佳方法之一。 在工廠模式中,我們沒有建立邏輯暴露給客戶端建立物件,並使用一個通用的介面引用新建立的物件。 實現方法 我們將建立一個Shape介面和實現Shape介面的具體類。 一個工廠類S

人人都能讀懂的設計模式1建立型模式

簡介 設計模式用於解決反覆出現的問題,是解決特定問題的指導方針。設計模式不是在應用中引用的類、package 或者庫,而是在某些特定場景下解決特定問題的指導方針。 設計模式用於解決反覆出現的問題,是解決某些特定問題的指導方針。 維基百科中這樣描述設計模式: 在軟體工

手把手教你做一個 C 語言編譯器1設計

本章是“手把手教你構建 C 語言編譯器”系列的第二篇,我們要從整體上講解如何設計我們的 C 語言編譯器。 本系列: 首先要說明的是,雖然標題是編譯器,但實際上我們構建的是 C 語言的直譯器,這意味著我們可以像執行指令碼一樣去執行 C 語言的原始碼檔案。這麼做的理由

設計模式命令模式1——基本的命令模式

直接 封裝 技術分享 利用 basic 記錄 不同的 深入 深入理解 前言 命令模式的講解分為四篇: 設計模式(一):命令模式(1)——基本的命令模式 設計模式(一):命令模式(2)——命令模式擴展之宏命令 設計模式(

與介面相關的設計模式1定製服務模式和介面卡模式詳解

在Java中我們通常把介面作為系統與外界互動的視窗,接下來我們來考慮以下問題: 如何設計介面? 當兩個系統之間介面不匹配時,如何處理? 但系統A無法便捷的引用系統B的介面的實現類例項時,如何處理? …… 為了解決以上問題,需要引入與介面相關的設計模式,接

設計模式1單例模式

定義:確保一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 型別:建立類模式 類圖: 類圖知識點: 1.類圖分為三部分,依次是類名、屬性、方法 2.以<<開頭和以>>結尾的為註釋資訊 3.修飾符+代表public,-代表p

設計模式 工廠模式

dem blank hibernate 執行 oid code 做出 void actor 工廠模式 工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。 在工廠模式中,我們在創建

23種設計模式9訪問者模式

類方法 打印 interface 增加 http col visitor 設計模式的 接口 定義:封裝某些作用於某種數據結構中各元素的操作,它可以在不改變數據結構的前提下定義作用於這些元素的新的操作。 類型:行為類模式 類圖: 訪問者模式可能是行為類模式中最

在STM32上實現NTFS之4GPT分區表的C語言實現1主GPT表頭的實現

center mbr分區 sum 對齊 字節數 決定 容器 alt 水平 題外話:在荒廢了很久沒有更新之後……某日突然收到讀者的站內信!內容大體是詢問GPT分區表信息的讀取方式,筆者激動萬分之下,決定繼續解剖NTFS……其實GPT嚴格上不算是NTFS的內容, GPT和M

23種設計模式1-單例模式

如果 static 拓展 銷毀 jvm垃圾收集器 單例類 不為 全局 返回值 定義: 單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。 特點:

設計模式1----單例模式

內存 內部 gin strong 系統 方法 main 重新 out 簡介: 單例模式(Singleton)是一種常用的軟件設計模式,在它的核心結構中只包含一個被稱為單例的特殊類。 定義: 確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 單例模式 單例模式

設計模式1——單例模式

虛擬 span 源碼 加載 定義 實例變量 不能 內存 而且 在Java開發過程中,很多場景下都會碰到或要用到單例模式,在設計模式裏也是經常作為指導學習的熱門模式之一,相信每位開發同事都用到過。我們總是沿著前輩的足跡去做設定好的思路,往往沒去探究為何這麽做,所以這篇文章對單

設計模式裝飾模式

實體 裝飾者 java string rgs 大氣 sta 接口 rri 2018國慶黃金周來了,恰值國慶黃金周節假日,我想高速上一定車山車海,還好我選擇了高鐵,不然肯定需要尋找項目合作人或在高速上吃創業人士的炒飯炒面了。 國慶7天長假,天氣又如此的好,所謂風和日麗,如此良

23種設計模式16狀態模式

ava 關系 subclass [] key 語句 多分支 分支 ctx 概述 定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。 類型:行為類模式。 類圖: 適用性: 1.一個對象的行為取決於它的狀態,並且它