本文共 1574 字,大约阅读时间需要 5 分钟。
概述:
我们玩单机游戏的时候总会遇到老婆大人的各位事情,一会去买瓶醋了,一会去打个酱油了,会耽误我们玩游戏的进程,但是此时我们能有“保存游戏”这个宝贝,我们的主基地不会在我们打酱油的时候被对手拆掉。
这“保存游戏”的功能其实就是备忘录模式的很好应用,她是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。这个其实也是我们的redo,undo所采用的模式。
类图和实例:
- #include <iostream>
- #include <string>
- using namespace std;
- class Memento {
- private:
- string state;
-
-
- public:
- Memento()
- {
- state = "";
- }
- Memento(string state){
- this->state = state;
- }
- string getState() {
- return state;
- }
- void setState(string state) {
- this->state = state;
- }
- };
-
-
- class Originator {
- private :
- string state;
-
-
- public:
- Originator()
- {
- state = "";
- }
-
-
- string getState() {
- return state;
- }
- void setState(string state) {
- this->state = state;
- }
- Memento createMemento(){
- return Memento(this->state);
- }
- void restoreMemento(Memento memento){
- this->setState(memento.getState());
- }
- };
-
-
-
-
- class Caretaker {
- private :
- Memento memento;
- public :
- Memento getMemento(){
- return memento;
- }
- void setMemento(Memento memento){
- this->memento = memento;
- }
- };
- int main (int argc, char *argv[])
- {
- Originator originator;
- originator.setState("状态1");
- cout<<"初始状态:"<<originator.getState()<<endl;
- Caretaker caretaker;
- caretaker.setMemento(originator.createMemento());
- originator.setState("状态2");
- cout<<"改变后状态:"<<originator.getState()<<endl;
- originator.restoreMemento(caretaker.getMemento());
- cout<<"恢复后状态:"<<originator.getState()<<endl;
- }
适用性:
适用于功能比较复杂的,但需要记录或维护属性历史的类;或者需要保存的属性只是众多属性中的一小部分时Originator可以根据保存的Memo还原到前一状态。
优缺点:
优点:
1)当发起人角色的状态有改变时,有可能是个错误的改变,我们使用备忘录模式就可以把这个错误改变还原。
2)备份的状态是保存在发起人角色之外的,这样,发起人角色就不需要对各个备份的状态进行管理。
缺点:
1)如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。