设计模式(C++)详解——备忘录模式(1),RabbitMQ 和 Kafka 对比。

张开发
2026/6/9 17:53:16 15 分钟阅读
设计模式(C++)详解——备忘录模式(1),RabbitMQ 和 Kafka 对比。
备忘录模式概述备忘录模式Memento Pattern是一种行为设计模式允许在不暴露对象实现细节的情况下捕获并外部化对象的内部状态以便后续可恢复到此状态。该模式通过三个核心角色实现Originator原发器需要保存状态的对象。Memento备忘录存储原发器内部状态的对象。Caretaker管理者负责保存和恢复备忘录的对象。适用场景需要实现撤销Undo或回滚Rollback功能时。直接访问对象状态会破坏封装性但需保存状态供后续恢复。系统状态需要快照Snapshot管理如游戏存档、事务回滚等。C实现示例备忘录类Memento存储原发器的状态仅允许原发器访问其内部数据class Memento { private: std::string state_; // 假设状态为字符串 friend class Originator; // 仅允许Originator访问 Memento(const std::string state) : state_(state) {} std::string GetState() const { return state_; } };原发器类Originator负责创建备忘录并从中恢复状态class Originator { private: std::string state_; // 内部状态 public: void SetState(const std::string state) { state_ state; } std::string GetState() const { return state_; } // 创建备忘录 Memento* CreateMemento() const { return new Memento(state_); } // 从备忘录恢复状态 void RestoreMemento(const Memento* memento) { state_ memento-GetState(); } };管理者类Caretaker管理备忘录的生命周期不直接操作其内容class Caretaker { private: std::vectorMemento* mementos_; // 存储备忘录历史 public: void AddMemento(Memento* memento) { mementos_.push_back(memento); } Memento* GetMemento(int index) const { return mementos_.at(index); } ~Caretaker() { for (auto m : mementos_) delete m; } };使用示例int main() { Originator originator; Caretaker caretaker; originator.SetState(State #1); caretaker.AddMemento(originator.CreateMemento()); // 保存状态 originator.SetState(State #2); // 修改状态 std::cout Current State: originator.GetState() std::endl; originator.RestoreMemento(caretaker.GetMemento(0)); // 恢复状态 std::cout Restored State: originator.GetState() std::endl; return 0; }关键点与注意事项封装性保护备忘录通过friend类限制状态访问确保只有原发器能修改其内容。性能权衡频繁保存大对象状态可能导致内存开销需考虑增量备份或压缩策略。线程安全多线程环境下需对备忘录的创建和恢复加锁。扩展应用结合原型模式Prototype实现深拷贝备忘录或与命令模式Command协同实现多级撤销功能。share.pywnwtr.cn/Article/details/848179.HKMshare.kxbaekm.cn/Article/details/274541.HKMshare.aklgtug.cn/Article/details/403678.HKMshare.kwcnwrx.cn/Article/details/090321.HKMshare.mugicfd.cn/Article/details/835186.HKM

更多文章