#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;
}
备忘录模式c++
最新推荐文章于 2024-03-13 14:14:00 发布