C++备忘录模式(Memento)

    xiaoxiao2022-07-07  189

    UML类图(仅供参考)如下:

    备忘录模式解决的问题:

    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,适当的时候可以让已经改变的对象恢复到之前的状态

    源码

    #include <string> #include <iostream> // 备份类,和需要备份的类一一对应 class CMemento { public: // 备份时调用 void SetStatus(const std::string &sStatus) { m_sStatus = sStatus; } // 恢复时调用 std::string GetStatus() const { return m_sStatus; } private: // 假设这就是需要备份的状态 // 当然可能有很多成员值需要备份 std::string m_sStatus; }; // 这个类需要备份 // 其实就是备份其中的成员 class COriginator { public: // 改变成员值 void SetStatus(const std::string &sStatus) { this->m_sStatus = sStatus; } // 创建备份 CMemento CreateMemento() { CMemento memento; memento.SetStatus(m_sStatus); return memento; } // 恢复备份 void RegainMemento(const CMemento &memento) { this->m_sStatus = memento.GetStatus(); } void ShowMemento() const { std::cout << "当前的备份为m_sStatus = " << m_sStatus << std::endl; } private: // 需要备份的状态 std::string m_sStatus; }; // 备份管理类(可有可无) // 是为了不在客户端暴露备份类 class CCaretaker { public: // 保存备份对象 void SetMemento(const CMemento &memento) { m_Memento = memento; } // 取出备份对象 CMemento GetMemento() const { return m_Memento; } private: // 备份对象 CMemento m_Memento; }; int main() { // 设置初始状态 COriginator originator; originator.SetStatus("ON"); originator.ShowMemento(); // 保存备份 CCaretaker caretaker; caretaker.SetMemento(originator.CreateMemento()); // 改变状态 originator.SetStatus("OFF"); originator.ShowMemento(); // 恢复备份 originator.RegainMemento(caretaker.GetMemento()); originator.ShowMemento(); return 0; }

    好处

    1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。

    2、实现了信息的封装,使得用户不需要关心状态的保存细节

    最新回复(0)