学习笔记:备忘录模式
模式简介
:属于行为型模式,保存一个对象的某个状态,以便在适当的时候恢复对象。
为什么用
:记录状态就可以实现回到原先保存的状态。???
怎么样用
:需要保存的类数据写成一个结构体,类里提供获取和设置数据的方法,再写一个仓库类管理数据,也提供获取和设置数据的方法,实现总体管理数据。
注意事项
:可以结合原型模式使用。
实际举例
:游戏多存档实现。
#include <iostream>
#include <vector>
using namespace std;
class Person {
private:
friend class Person_Attr_Repository;
struct Attr {
string name;
string lv;
string pro;
Attr() {
name = "null";
lv = "null";
pro = "null";
}
Attr(string _name,string _lv,string _pro) {
name = _name;
lv = _lv;
pro = _pro;
}
}attr;
public:
void setAttr(Attr _attr) {
this->attr = _attr;
}
Attr getAttr() {
return attr;
}
void showAttr() {
cout <<"name: "<< attr.name <<"\n"
<<"lv: "<<attr.lv <<"\n"
<<"pro: "<<attr.pro << "\n";
}
};
class Person_Attr_Repository {
private:
vector<Person::Attr>v;
int size;
public:
Person_Attr_Repository() {
size = 5;
}
void add(Person::Attr _attr) {
if (v.size() < 5) {
v.push_back(_attr);
}
else {
cout << "The archive is full";
}
}
Person::Attr get(int index) {
if (index >= 1 && index <= size) {
return v[index - 1];
}
else {
cout << "The index is illgel";
return {};
}
}
};
int main(){
Person person;
Person_Attr_Repository repository;
//init-存档
person.setAttr({"moota","1","wizard"});
person.showAttr();
repository.add(person.getAttr());
//transfer-存档
person.setAttr({ "moota","1","warrior" });
person.showAttr();
repository.add(person.getAttr());
//get-读取一号存档
person.setAttr(repository.get(1));
person.showAttr();
//get-读取二号存档
person.setAttr(repository.get(2));
person.showAttr();
return 0;
}