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

 

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

 

 

  

 

posted on   崔好好  阅读(256)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示