1. 程式人生 > >我所理解的設計模式(C++實現)——備忘錄模式(Memento Pattern)

我所理解的設計模式(C++實現)——備忘錄模式(Memento Pattern)

概述:

    我們玩單機遊戲的時候總會遇到老婆大人的各位事情,一會去買瓶醋了,一會去打個醬油了,會耽誤我們玩遊戲的程序,但是此時我們能有“儲存遊戲”這個寶貝,我們的主基地不會在我們打醬油的時候被對手拆掉。

    這“儲存遊戲”的功能其實就是備忘錄模式的很好應用,她是在不破壞封裝的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可以就該物件恢復到原先儲存的狀態。這個其實也是我們的redo,undo所採用的模式。

類圖和例項:


簡單的模式例項:
#include <iostream>
#include <string>
using namespace std;
class Memento {
private:
    string state;


public:
    Memento()
    {
        state = "";
    }
    Memento(string state){
        this->state = state;
    }
    string getState() {
        return state;
    }
    void setState(string state) {
        this->state = state;
    }
};


class Originator {
private :
    string state;


public:
    Originator()
    {
        state = "";
    }


    string getState() {
        return state;
    }
    void setState(string state) {
        this->state = state;
    }
    Memento createMemento(){
        return Memento(this->state);
    }
    void restoreMemento(Memento memento){
        this->setState(memento.getState());
    }
};




class Caretaker {
private :
    Memento memento;
public :
    Memento getMemento(){
        return memento;
    }
    void setMemento(Memento memento){
        this->memento = memento;
    }
};
int main (int argc, char *argv[])   
{
    Originator originator;
    originator.setState("狀態1");
    cout<<"初始狀態:"<<originator.getState()<<endl;
    Caretaker caretaker;
    caretaker.setMemento(originator.createMemento());
    originator.setState("狀態2");
    cout<<"改變後狀態:"<<originator.getState()<<endl;
    originator.restoreMemento(caretaker.getMemento());
    cout<<"恢復後狀態:"<<originator.getState()<<endl;
}

適用性:

適用於功能比較複雜的,但需要記錄或維護屬性歷史的類;或者需要儲存的屬性只是眾多屬性中的一小部分時Originator可以根據儲存的Memo還原到前一狀態。 

優缺點:

優點:

1)當發起人角色的狀態有改變時,有可能是個錯誤的改變,我們使用備忘錄模式就可以把這個錯誤改變還原。

2)備份的狀態是儲存在發起人角色之外的,這樣,發起人角色就不需要對各個備份的狀態進行管理。

缺點:

1)如果備份的物件存在大量的資訊或者建立、恢復操作非常頻繁,則可能造成很大的效能開銷。

LCL_data原創於CSDN.NET【http://blog.csdn.net/lcl_data/article/details/9745019】

相關推薦

《大話設計模式c++實現 建造者模式

建造者模式(Builder):將一個複雜物件的構建和它的表示分離,使得同樣的構建過程可以建立不同的表示。 角色: (1)Builder:是為建立一個Product物件的各個部件指定的抽象介面。 (2)ConcreteBuilder:是具體建立者,實現Builder介面,構造和裝配各個部件。 (3)

《大話設計模式c++實現 抽象工廠模式

  為了更清晰地理解工廠方法模式,需要先引入兩個概念: 產品等級結構 :產品等級結構即產品的繼承結構,如一個抽象類是電視機,其子類有海爾電視機、海信電視機、TCL電視機,則抽象電視機與具體品牌的電視機之間構成了一個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。

案例3.2:括號匹配的檢驗c++實現/資料結構/棧的基本操作

#include<iostream> #define MaxSize 100 #define OK 1 #define ERROR 0 using namespace std; typedef char ElemType; typedef int Status

理解設計模式C++實現——迭代器模式Iterator Pattern

概述:         在現在的電視機中,我們使用[後一個]和[前一個]按鈕可以很方便的換臺,當按下[後一個]按鈕時,將切換到下一個預置的頻道。想象一下在陌生的城市中的旅店中看電視。當改變頻道時,重要的不是幾頻道,而是節目內容。如果對一個頻道的節目不感興趣,那麼可以換下一個頻道,而不需要知道它是幾頻道。  

理解設計模式C++實現——責任鏈模式Chain Of Responsibility Pattern

概述:      辛辛苦苦了工作了一年,終於可以加薪了,向主管提交了加薪申請,主管一看不得了,自己職權不夠,批不了,主管把申請上交總監,總監發現自己也批不了,申請到了總經理手中,總經理一看,小夥子口氣不小了,有膽識敢申請,先來談下心。預知後事如何,請看下回分解。     

理解設計模式C++實現——外觀模式Facade Pattern

概述 想想我們小時候玩的四驅車,裡面的構造很複雜,馬達,舵機,電池組等等,而我們控制它卻非常簡單,只要開啟電池開關,他就可以跑。我們其實不用知道它裡面是如何工作,只要知道撥動開關它就可以工作就行了,這個開關其實就四驅車給我們的一個友好的元件,使得我們可以很方便的控制它。 外

理解設計模式C++實現——備忘錄模式Memento Pattern

概述:     我們玩單機遊戲的時候總會遇到老婆大人的各位事情,一會去買瓶醋了,一會去打個醬油了,會耽誤我們玩遊戲的程序,但是此時我們能有“儲存遊戲”這個寶貝,我們的主基地不會在我們打醬油的時候被對手拆掉。     這“儲存遊戲”的功能其實就是備忘錄模式的很好應用,她是在不

理解設計模式C++實現——享元模式Flyweight Pattern

概述 想想我們編輯文件用的wps,文件裡文字很多都是重複的,我們不可能為每一個出現的漢字都建立獨立的空間,這樣代價太大,最好的辦法就是共享其中相同的部分,使得需要建立的物件降到最小,這個就是享元模式的核心,即運用共享技術有效地支援大量細粒度的物件。 享元物件能做到共享的關

理解設計模式C++實現——訪問者模式Visitor Pattern

概述: 我們去銀行櫃檯辦業務,一般情況下會開幾個個人業務櫃檯的,你去其中任何一個櫃檯辦理都是可以的。我們的訪問者模式可以很好付諸在這個場景中:對於銀行櫃檯來說,他們是不用變化的,就是說今天和明天提供個人業務的櫃檯是不需要有變化的。而我們作為訪問者,今天來銀行可能是取消費流水

理解設計模式C++實現——狀態模式State Pattern

概述:      看看我們平時用的開關,同樣一個開關他有2種狀態:開和關,當她處於不同的狀態的時候她的行為是不一樣的,比如當她是開著的時候,你按她一下,她就變成了關閉狀態,她是關著的時候按她一下,她就變成了開著的狀態。看上去就像是改變了它的類一樣,其實我們開發者都知道,我們

設計模式——抽象工廠模式C++實現

concrete out png return style bsp ctp img using 1 #include <iostream> 2 #include <string> 3 4 usin

設計模式——觀察者模式C++實現

ace mes des ret rtu cto pattern virt date 1 #include <iostream> 2 #include <vector> 3 #include <algorithm>

設計模式——命令模式C++實現

clear cto ive pre urn bak std oot style 1 [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp 2 #include <

設計模式——職責鏈模式C++實現

delet hand jin void ng- nbsp request req oot   1 #include <iostream> 2 #include <string> 3 4 using namesp

設計模式——中介者模式/調停者模式C++實現

con 分享 else .cn sign name 得到 ted esp 1 #include <iostream> 2 #include <string> 3 4 using namespace std;

設計模式C++實現12——備忘錄模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一下理解。主要參考《大話設計模式》

設計模式——單例模式C++實現

一、單例模式定義: 保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點,該例項被所有程式模組共享。 二、應用場景: 比如在某個伺服器程式中,該伺服器的配置資訊存放在一個檔案中,這些配置資料由一個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置

最常用的設計模式---裝飾者模式C++實現

      上一篇說了介面卡模式,這一篇接著學習裝飾者模式。     想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選擇。      裝飾者模式主要實現的功能是動態的給某一個類新增一些額外的功能,它是一個錦上添花者。想要擴充套件功能,裝飾者提供了有別於繼承的另外一種選

設計模式示例C++實現

最近參加了軟考,在準備考試過程中發現其中給出設計類圖讓通過指定的設計模式進行設計的題目對於練習C++和軟體開發是一種不錯的的方式,因為學校中的C++課程只講C++語言,雖然也講了封裝、繼承、多型等特性,但是缺少相應的練習,使得沒有深入的認識和理解。同時類似於程式

Head First 設計模式C++實現:單例模式:Singleton

單例模式:確保一個類只有一個例項,並提供一個全域性訪問點 1 .經典單例模式實現   我們都很清楚一個簡單的單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部儲存一個private static的類指標儲存唯一的例項,例項的動