C++设计模式(1):备忘录模式

来源:互联网 发布:日本ip代理地址和端口 编辑:程序博客网 时间:2024/06/10 01:41

这是一系列的文章,在这些文章的开头会首先介绍这个模式,并稍加讨论。然后介绍类图、结构、以及代码。最后对这个模式进行完整的讨论,包括适用性、应用场景、优缺点、与其他模式的关系等等。

在我们设计需要撤回的软件,或者一些游戏的存档时,就需要用到备忘录模式。
备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并在该对象外部保存状态,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

备忘录模式的UML图如下:
这里写图片描述
该类图中有以下三个方面:
Memento(备忘录):存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态;防止原发器以外的其他对象访问备忘录
Originator(原发器):创建一个备忘录,用于记录当前时刻它的内部状态;使用备忘录恢复内部状态
Caretaker(管理者):负责保存好备忘录;不能对备忘录的内容进行操作或检查

代码:

//备忘录class Memento{public:    string state;    Memento(string state) //记录当前的状态,    {        this->state = state;    }};class Originator{public:    string state;                     void setMemento(Memento *memo)      // 通过调用Caretaker中相应的备忘录来恢复状态    {        state = memo->state;        }    Memento *createMemento()          //只有原发器才能向备忘录存取信息,备忘录对其他对象是不可见的    {        return new Memento(state);    }    void show()    {        cout << state << endl;    }};//备忘录的管理器class Caretaker{public:    vector<Memento *> memo;    void save(Memento *memo)    {        (this->memo).push_back(memo);    }    Memento *getState(int i)    {        return memo[i];    }};int main(){    Originator *og = new Originator();    Caretaker *ct = new Caretaker();    og->state = "状态1";    og->show();    ct->save(og->createMemento());    og->state = "状态2";    og->show();    ct->save(og->createMemento());    og->state = "状态3";    og->show();    ct->save(og->createMemento());    og->setMemento(ct->getState(1));    cout << "恢复第2个状态:";    og->show();    og->setMemento(ct->getState(2));    cout << "恢复第3个状态";    og->show();    cin.get();    return 0;}

备忘录模式适用于:
1、必须保存一个对象在某一时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

应用:
设计需要回放的软件,数据库备份,文档的撤销、恢复,游戏中的存档等都会用到此模式。

优点:
备忘录能返回到我们需要的状态,撤回我们的错误。并且备忘录保存在原发器之外,原发器只需要创建好备忘录而不必管理。
缺点:
如果备份的对象存在大量的信息或者创建、恢复操作非常频繁,则可能造成很大的性能开销。因此,备忘录模式不能用在for循环中,不能频繁建立。

与其他模式的关系:
在命令模式中,如果命令请求可以撤销的话,那这个功能可以由备忘录模式来实现。

原创粉丝点击