备忘录模式c++

xiaoxiao2021-02-28  113

#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; }
转载请注明原文地址: https://www.6miu.com/read-38726.html

最新回复(0)