您的位置:首页 > 其它

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

2014-08-19 00:52 183 查看
[b]1、说明[/b]

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

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

[b]2、demo [/b]

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

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

[b]3、上代码[/b]

#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;
}


[b]4、编译[/b]

g++ main.cpp -o main.out

[b]5、执行[/b]

[b]./main.out[/b]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: