首页 > 代码库 > 【设计模式】备忘录模式(以电影明日边缘为例)

【设计模式】备忘录模式(以电影明日边缘为例)

 

1、说明

    备忘录(Memento): 在不破坏封装性的前提下,捕获一个对象的内部装填,并在对象之外保存这个状态。 这样以后就可以将该对象恢复到原先保存的状态。

    三个要素:【发起者】 【备忘录】 【管理者】

 

2、demo   

电影明日边缘,阿汤哥被将军阁下扔到战场上,阿汤哥慢慢从基地
醒来,迷迷糊糊到看见军队到处在走,头昏混沉沉到,后来阿汤哥
还是被扔到里战场上, 可是阿汤哥每次挂掉以后都能从基地醒来
那阵开始,因此种就相当于游戏里到备忘录,自动读档。

【发起者】 阿汤哥
【备忘录】 阿汤哥读档是到状态
【管理者】 导演

 

 

3、上代码

    

#include <iostream>using std::cout;using std::endl;/*******************************************************设计模式备忘录模式三个要素:【发起者】 【备忘录】 【管理者】小例:电影明日边缘,阿汤哥被将军阁下扔到战场上,阿汤哥慢慢从基地醒来,迷迷糊糊到看见军队到处在走,头昏混沉沉到,后来阿汤哥还是被扔到里战场上, 可是阿汤哥每次挂掉以后都能从基地醒来那阵开始,因此种就相当于游戏里到备忘录,自动读档。【发起者】 阿汤哥【备忘录】 阿汤哥读档时到状态【管理者】 导演 *********************************************************/static char* pState = "慢慢醒来";static char* pBehaivor = "扶着头慢慢坐起来";//备忘录class CMemento{public:    CMemento(char* pState, char* pBehaivor) : m_pState(pState), m_pBehaivor(pBehaivor){}    virtual ~CMemento(){}    char* GetState() const {return m_pState;}    char* GetBehaivor() const {return m_pBehaivor;}protected:    char* m_pState;    char* m_pBehaivor;};//阿汤哥class CTom{public:    CTom(char* pState = 0, char* pBehaivor = 0, CMemento*  pMemento = 0)     : m_pState(pState), m_pBehaivor(pBehaivor), m_pMemento(pMemento){}    virtual ~CTom(){}    CMemento* CreateMemento() { return new CMemento(m_pState, m_pBehaivor); }    void SetMemento(CMemento* pMemento) {m_pState = pMemento->GetState(); m_pBehaivor = pMemento->GetBehaivor();}    void Show() const { cout << "\nState is " << m_pState << ", Behaivor is " << m_pBehaivor << " \n";}        void SetEnv(char* pState, char* pBehaivor) { m_pState = pState; m_pBehaivor = pBehaivor; }protected:    char* m_pState;    char* m_pBehaivor;    CMemento* m_pMemento;};//管理者class CCaretaker{public:    CCaretaker() : m_pMemento(0){}    virtual ~CCaretaker(){}    CMemento* GetMemento() const { return m_pMemento;}    void SetMemento(CMemento* pMemento) { m_pMemento = pMemento; }protected:     CMemento* m_pMemento;};int main(){    //state:慢慢醒来  behaivor:扶着头慢慢坐起来    CTom tom(pState, pBehaivor);    tom.Show();    cout <<  endl;    //管理者,保存当前状态    CCaretaker* pCaretaker = new CCaretaker();    pCaretaker->SetMemento(tom.CreateMemento());        //改变阿汤哥当前状态    tom.SetEnv("啊 阿汤哥中枪里", "阿汤哥昏迷倒下了");    tom.Show();    cout << "---------------说明:阿汤哥要读档了!-------------" << endl;    //恢复阿汤哥之前状态    tom.SetMemento(pCaretaker->GetMemento());    tom.Show();    cout << endl;    return 0;}

 

 

 

4、编译

g++  main.cpp -o main.out

 

5、执行

./main.out