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


     

    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 << "
    State is " << m_pState << ", Behaivor is " << m_pBehaivor << " 
    ";}    
        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

     

      

  • 相关阅读:
    sqlserver查询某个数据库有多少个表 ,存过,函数,视图
    C# 金额转为大写金额
    C# TextBox中只能输入数字的几种常用方法(C#)
    C# 设置Excel单元格属性
    MS SQL 维护小记
    webapi demo
    远程 TeamViewer
    https://github.com/
    C# Fun 类似委托
    技术点文章收集
  • 原文地址:https://www.cnblogs.com/cuish/p/3920952.html
Copyright © 2020-2023  润新知