C++备忘录模式:轻松实现状态回滚

备忘录模式的核心概念

备忘录模式(Memento Pattern)是一种行为设计模式,允许在不破坏对象封装性的前提下捕获并外部化对象的内部状态,以便后续可恢复到此状态。其核心角色包括:

  • Originator(发起人):需要保存状态的对象,提供创建备忘录和从备忘录恢复的方法。
  • Memento(备忘录):存储发起人对象的内部状态,通常设计为不可变对象。
  • Caretaker(管理者):负责保存和管理备忘录,但不应修改其内容。

C++实现备忘录模式的关键代码

以下是一个简单的C++实现示例,展示如何保存和恢复对象的内部状态:

#include <iostream>
#include <string>
#include <vector>

// 备忘录类(Memento)
class Memento {
private:
    std::string state_;
    explicit Memento(const std::string& state) : state_(state) {}
    friend class Originator; // 允许Originator访问私有成员

public:
    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 Memento(state_); }
    void RestoreFromMemento(const Memento& memento) { state_ = memento.GetState(); }
};

// 管理者类(Caretaker)
class Caretaker {
private:
    std::vector<Memento> mementos_;

public:
    void AddMemento(const Memento& memento) { mementos_.push_back(memento); }
    Memento GetMemento(size_t index) const { return mementos_.at(index); }
};

int main() {
    Originator originator;
    Caretaker caretaker;

    originator.SetState("State #1");
    caretaker.AddMemento(originator.CreateMemento());

    originator.SetState("State #2");
    caretaker.AddMemento(originator.CreateMemento());

    originator.RestoreFromMemento(caretaker.GetMemento(0));
    std::cout << "Restored State: " << originator.GetState() << std::endl; // 输出: State #1
}

备忘录模式的应用场景

  • 撤销/重做功能:如文本编辑器保存编辑历史。
  • 游戏存档:保存游戏进度并在需要时恢复。
  • 事务回滚:数据库操作中保存状态以便回滚到之前的状态。

实现注意事项

  • 封装性保护:备忘录应仅允许发起人访问其内部状态,避免其他类直接修改。
  • 性能优化:频繁保存状态可能占用内存,可通过增量备份或压缩策略优化。
  • 深拷贝与浅拷贝:若状态包含指针或动态资源,需确保备忘录实现深拷贝。

扩展:结合原型模式优化

对于复杂对象的状态保存,可结合原型模式(Prototype Pattern)克隆对象状态,减少直接暴露内部细节的风险。

class Originator {
public:
    virtual std::unique_ptr<Memento> CreateMemento() const {
        return std::make_unique<Memento>(*this); // 假设Memento支持拷贝构造
    }
};

通过备忘录模式,C++开发者可以更灵活地管理对象状态,同时保持代码的整洁性和可维护性。

BbS.okacop050.info/PoSt/1120_579469.HtM
BbS.okacop051.info/PoSt/1120_896221.HtM
BbS.okacop052.info/PoSt/1120_360797.HtM
BbS.okacop053.info/PoSt/1120_318835.HtM
BbS.okacop054.info/PoSt/1120_989925.HtM
BbS.okacop055.info/PoSt/1120_995223.HtM
BbS.okacop056.info/PoSt/1120_581159.HtM
BbS.okacop057.info/PoSt/1120_826669.HtM
BbS.okacop058.info/PoSt/1120_674953.HtM
BbS.okacop059.info/PoSt/1120_531620.HtM
BbS.okacop050.info/PoSt/1120_360538.HtM
BbS.okacop051.info/PoSt/1120_079953.HtM
BbS.okacop052.info/PoSt/1120_297455.HtM
BbS.okacop053.info/PoSt/1120_683964.HtM
BbS.okacop054.info/PoSt/1120_697153.HtM
BbS.okacop055.info/PoSt/1120_984909.HtM
BbS.okacop056.info/PoSt/1120_272890.HtM
BbS.okacop057.info/PoSt/1120_384134.HtM
BbS.okacop058.info/PoSt/1120_223164.HtM
BbS.okacop059.info/PoSt/1120_997157.HtM
BbS.okacop050.info/PoSt/1120_390238.HtM
BbS.okacop051.info/PoSt/1120_244078.HtM
BbS.okacop052.info/PoSt/1120_459212.HtM
BbS.okacop053.info/PoSt/1120_061864.HtM
BbS.okacop054.info/PoSt/1120_380133.HtM
BbS.okacop055.info/PoSt/1120_901726.HtM
BbS.okacop056.info/PoSt/1120_888267.HtM
BbS.okacop057.info/PoSt/1120_188193.HtM
BbS.okacop058.info/PoSt/1120_809862.HtM
BbS.okacop059.info/PoSt/1120_336768.HtM
BbS.okacop050.info/PoSt/1120_252941.HtM
BbS.okacop051.info/PoSt/1120_809317.HtM
BbS.okacop052.info/PoSt/1120_451394.HtM
BbS.okacop053.info/PoSt/1120_278734.HtM
BbS.okacop054.info/PoSt/1120_535296.HtM
BbS.okacop055.info/PoSt/1120_718535.HtM
BbS.okacop056.info/PoSt/1120_121474.HtM
BbS.okacop057.info/PoSt/1120_336375.HtM
BbS.okacop058.info/PoSt/1120_851802.HtM
BbS.okacop059.info/PoSt/1120_327511.HtM
BbS.okacop050.info/PoSt/1120_657789.HtM
BbS.okacop051.info/PoSt/1120_636598.HtM
BbS.okacop052.info/PoSt/1120_326257.HtM
BbS.okacop053.info/PoSt/1120_293414.HtM
BbS.okacop054.info/PoSt/1120_298635.HtM
BbS.okacop055.info/PoSt/1120_971974.HtM
BbS.okacop056.info/PoSt/1120_809319.HtM
BbS.okacop057.info/PoSt/1120_065801.HtM
BbS.okacop058.info/PoSt/1120_521969.HtM
BbS.okacop059.info/PoSt/1120_342722.HtM
BbS.okacop050.info/PoSt/1120_982929.HtM
BbS.okacop051.info/PoSt/1120_038694.HtM
BbS.okacop052.info/PoSt/1120_859273.HtM
BbS.okacop053.info/PoSt/1120_027425.HtM
BbS.okacop054.info/PoSt/1120_833460.HtM
BbS.okacop055.info/PoSt/1120_367759.HtM
BbS.okacop056.info/PoSt/1120_303210.HtM
BbS.okacop057.info/PoSt/1120_011995.HtM
BbS.okacop058.info/PoSt/1120_950456.HtM
BbS.okacop059.info/PoSt/1120_637379.HtM
BbS.okacop050.info/PoSt/1120_608168.HtM
BbS.okacop051.info/PoSt/1120_807775.HtM
BbS.okacop052.info/PoSt/1120_886604.HtM
BbS.okacop053.info/PoSt/1120_192104.HtM
BbS.okacop054.info/PoSt/1120_908193.HtM
BbS.okacop055.info/PoSt/1120_222625.HtM
BbS.okacop056.info/PoSt/1120_417838.HtM
BbS.okacop057.info/PoSt/1120_457954.HtM
BbS.okacop058.info/PoSt/1120_121505.HtM
BbS.okacop059.info/PoSt/1120_586949.HtM
BbS.okacop050.info/PoSt/1120_115789.HtM
BbS.okacop051.info/PoSt/1120_735817.HtM
BbS.okacop052.info/PoSt/1120_540063.HtM
BbS.okacop053.info/PoSt/1120_096596.HtM
BbS.okacop054.info/PoSt/1120_198284.HtM
BbS.okacop055.info/PoSt/1120_255620.HtM
BbS.okacop056.info/PoSt/1120_854889.HtM
BbS.okacop057.info/PoSt/1120_391943.HtM
BbS.okacop058.info/PoSt/1120_542930.HtM
BbS.okacop059.info/PoSt/1120_704272.HtM

#牛客AI配图神器#

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 10:05
点赞 评论 收藏
分享
11-11 16:40
已编辑
门头沟学院 人工智能
不知道怎么取名字_:这个有点不合理了,相当于已经毕业了,但还是没转正,这不就是白嫖
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务