备忘录模式c++

来源:互联网 发布:淘宝开黑车 编辑:程序博客网 时间:2024/06/03 09:37
#include <iostream>#include <string>#include <deque>using namespace std;//备忘录类(保存着事务的状态,对外不可见)class MememTo{public:    MememTo(string name, int age) :m_name(name), m_age(age){}    void setName(string name)    {        m_name = name;    }    string getName()    {        return m_name;    }    void setAge(int age)    {        m_age = age;    }    int getAge()    {        return m_age;    }private:    string m_name;    int m_age;};//需要备份的类class Person{public:    Person(string name, int age) :m_name(name), m_age(age){}    void print()    {        cout << m_name << " " << m_age << endl;    }    void setName(string name)    {        m_name = name;    }    string getName()    {        return m_name;    }    void setAge(int age)    {        m_age = age;    }    int getAge()    {        return m_age;    }    MememTo* createMememTo()    {        return new MememTo(m_name, m_age);    }    void getMememTo(MememTo* m)    {        if (m != nullptr)        {            m_name = m->getName();            m_age = m->getAge();            delete m;//释放内存        }    }private:    string m_name;    int m_age;};//一个容器存储着备忘录类的指针class Caretaker{public:    Caretaker()    {        m_deque.clear();    }    ~Caretaker()    {        for (deque<MememTo*>::iterator it = m_deque.begin();            it != m_deque.end(); ++it)        {            delete (*it);//释放内存        }        m_deque.clear();    }    void setMememTo(MememTo* m)    {        if (m_deque.size() != 10)//假设只能存储10个先前的状态        {            m_deque.push_back(m);        }        else        {            delete m_deque[0];            m_deque.pop_front();//弹出            m_deque.push_back(m);        }    }    MememTo* getMememTo()    {        if (!m_deque.empty())        {            MememTo* temp = *(m_deque.rbegin());            m_deque.pop_back();            return temp;        }        else        {            return nullptr;        }    }private:    deque<MememTo*> m_deque;};int main(){    Person* pPerson = nullptr;    Caretaker* pC = nullptr;    pPerson = new Person("zhang", 33);    pPerson->print();//zhang    pC = new Caretaker;    pC->setMememTo(pPerson->createMememTo());    pPerson->setName("lixi");    pPerson->setAge(32);    pPerson->print();//lixi    pC->setMememTo(pPerson->createMememTo());    pPerson->getMememTo(pC->getMememTo());    pPerson->print();//lixi    pPerson->getMememTo(pC->getMememTo());    pPerson->print();//zhang    //已经没有状态了,所以是最原先的状态,也就是上一次的状态    pPerson->getMememTo(pC->getMememTo());    pPerson->print();//zhang    delete pC;    delete pPerson;    return 0;}
原创粉丝点击