一,概述
定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
2.Memento(备忘录):
负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:
Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。
Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
3.Caretaker(管理者):
负责备忘录Memento,
不能对Memento的内容进行访问或者操作。
二,基本代码格式
#include <iostream>
using namespace std;
class Memento//备忘录,存储 Originator内部状态
{
private:
string state;
public:
Memento(string state)
{
this->state = state;
}
string getState()
{
return state;
}
};
class Originator//发起人,创建备忘录
{
private:
string state;
public:
string getState()
{
return state;
}
void setState(string value)
{
this->state = value;
}
Memento* CreateMemento()//创建备忘录
{
return (new Memento(state));
}
void SetMemento(Memento *memento)
{
this->state = memento->getState();
}
void Show()//显示备忘录状态
{
cout<<"State="<<state<<endl;
}
};
class Caretaker//管理者
{
public:
Memento *memento;
public:
Memento* getMemento()//返回备忘录状态
{
return memento;
}
Memento* setMemento(Memento *mymemento)//设定备忘录状态
{
this->memento=mymemento;
}
};
int main()
{
Originator *o = new Originator();//发起人
o->setState("On");
o->Show();
Caretaker *c = new Caretaker();//管理者
c->setMemento(o->CreateMemento());//保存状态
o->setState("Off");//当游戏挂掉
o->Show();
o->SetMemento(c->getMemento());//恢复之前保存的备忘录状态
o->Show();
}
三,示例(存储游戏进度)
玩游戏的时候,通常为了可以重复玩某一关关卡,在闯关之前先保存游戏状态。然后,假如没有闯关成功,再恢复到之前的状态重新闯关。
1)最原始的存储游戏进度方法
方法:新建立一个游戏角色类,用以保存状态。
当需要恢复状态的时候,让状态存储类的数据恢复到游戏角色类中
缺点:暴漏了实现细节
#include <iostream>
using namespace std;
class GameRole
{
//生命力
private:
int vit;
public:
int getVitality()
{
return vit;
}
void setVitality(int value)
{
this->vit = value;
}
//攻击力
private:
int atk;
public:
int getAttack()
{
return atk;
}
void setAttack(int value)
{
this->atk = value;
}
//防御力
private:
int def;
public:
int getDefense()
{
return def;
}
void setDefense(int value)
{
this->def = value;
}
//状态显示
void StateDisplay()
{
cout<<"角色当前状态:"<<endl;
cout<<"体力:"<<this->vit<<endl;
cout<<"攻击力:"<<this->atk<<endl;
cout<<"防御力:"<<this->def<<endl;
}
//获得初始状态
void GetInitState()
{
this->vit = 100;
this->atk = 100;
this->def = 100;
}
//战斗
void Fight()
{
this->vit = 0;
this->atk = 0;
this->def = 0;
}
};
int main()
{
//大战Boss前
GameRole *lixiaoyao = new GameRole();
lixiaoyao->GetInitState();
lixiaoyao->StateDisplay();
//保存进度
GameRole *backup = new GameRole();
backup->setVitality(lixiaoyao->getVitality());
backup->setAttack(lixiaoyao->getAttack());
backup->setDefense(lixiaoyao->getDefense());
//大战Boss时,损耗严重
lixiaoyao->Fight();
lixiaoyao->StateDisplay();
//恢复之前状态
lixiaoyao->setVitality(backup->getVitality());
lixiaoyao->setAttack(backup->getAttack());
lixiaoyao->setDefense(backup->getDefense());
lixiaoyao->StateDisplay();
}
2)备忘录模式
优点:客户端隐藏了实现细节。
#include <iostream>
using namespace std;
//角色状态存储箱
class RoleStateMemento
{
private: int vit;
int atk;
int def;
public:
RoleStateMemento(int vit, int atk, int def)
{
this->vit = vit;
this->atk = atk;
this->def = def;
}
//生命力
int getVitality()
{
return vit;
}
void setVitality(int value)
{
this->vit = value;
}
//攻击力
int getAttack()
{
return atk;
}
void setAttack(int value)
{
this->atk = value;
}
//防御力
int getDefense()
{
return def;
}
void setDefense(int value)
{
this->def = value;
}
};
class GameRole
{
//生命力
private:
int vit;
public:
int getVitality()
{
return vit;
}
void setVitality(int value)
{
this->vit = value;
}
//攻击力
private:
int atk;
public:
int getAttack()
{
return atk;
}
void setAttack(int value)
{
this->atk = value;
}
//防御力
private:
int def;
public:
int getDefense()
{
return def;
}
void setDefense(int value)
{
this->def = value;
}
//状态显示
void StateDisplay()
{
cout<<"角色当前状态:"<<endl;
cout<<"体力:"<<this->vit<<endl;
cout<<"攻击力:"<<this->atk<<endl;
cout<<"防御力:"<<this->def<<endl;
}
//保存角色状态
RoleStateMemento *SaveState()
{
return (new RoleStateMemento(vit, atk, def));
}
//恢复角色状态
void RecoveryState(RoleStateMemento *memento)
{
this->vit = memento->getVitality();
this->atk = memento->getAttack();
this->def = memento->getDefense();
}
//获得初始状态
void GetInitState()
{
this->vit = 100;
this->atk = 100;
this->def = 100;
}
//战斗
void Fight()
{
this->vit = 0;
this->atk = 0;
this->def = 0;
}
};
//角色状态管理者
class RoleStateCaretaker
{
private:
RoleStateMemento *memento;
public:
RoleStateMemento* getMemento()
{
return memento;
}
void setMemento(RoleStateMemento *value)
{
this->memento = value;
}
};
int main()
{
//大战Boss前
GameRole *lixiaoyao = new GameRole();
lixiaoyao->GetInitState();
lixiaoyao->StateDisplay();
//保存进度
RoleStateCaretaker *stateAdmin = new RoleStateCaretaker();
stateAdmin->setMemento(lixiaoyao->SaveState());
//大战Boss时,损耗严重
lixiaoyao->Fight();
lixiaoyao->StateDisplay();
//恢复之前状态
lixiaoyao->RecoveryState(stateAdmin->getMemento());
lixiaoyao->StateDisplay();
}
分享到:
相关推荐
JAVA-设计模式-行为型模式-备忘录模式
设计模式专题之(十九)备忘录模式--设计模式备忘录模式示例代码(python--c++)
java设计模式-备忘录模式源代码, 源码中为设计模式的工程源文件,已经测试过,没有问题。
设计模式-备忘录模式(讲解及其实现代码)
c++设计模式-行为型模式-备忘录模式;qt工程;c++简单源码;备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先...
设计模式之备忘录模式 设计模式之备忘录模式 设计模式之备忘录模式 设计模式之备忘录模式 设计模式之备忘录模式
ios平台下备忘录模式最初简代码讲解何为备忘录模式,相关博客http://blog.sina.com.cn/s/blog_161d504630102wxis.html
微信小程序备忘录,备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录备忘录...
java常用设计模式-备忘录模式
微信小程序源码-备忘录.zip微信小程序源码-备忘录.zip微信小程序源码-备忘录.zip微信小程序源码-备忘录.zip微信小程序源码-备忘录.zip微信小程序源码-备忘录.zip微信小程序源码-备忘录.zip微信小程序源码-备忘录.zip...
Java设计模式,备忘录模式的Demo,具体的思想与实现有很多讲得很好的老师,我是看厉风行老师的视频学的,讲得不错,简单易懂
微信小程序毕业设计,微信小程序实例-备忘录(毕业设计) 微信小程序毕业设计,微信小程序实例-备忘录(毕业设计) 微信小程序毕业设计,微信小程序实例-备忘录(毕业设计) 微信小程序毕业设计,微信小程序实例-...
备忘录模式C++实现,若理解有误,请留言指出。
在备忘录模式里,一个备忘录是一个对象,它存储另一个对象(备忘录的原发器)在某个瞬间的内部状态。备忘的目的就是为了以后在需要的时候,可以将原发器对象的状态恢复(undo/rollback)到备忘录所保存的状态。 备忘...
备忘录模式.rar备忘录模式.rar备忘录模式.rar
用android编写的便捷备忘录,能实现增,删,改,查的功能。有时间提示,里面有apk文件可以down到手机上面直接运行,还有就是android studio项目,直接导入可以使用
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
23个设计模式之一的备忘录模式-极客学院-java-课件代码,
PPT内容包括:内附代码,实例,方便理解。...设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 备忘录模式java demo