• 设计模式——备忘录模式(memento)


    备忘录模式(Memento)

    备忘录模式是一个行为设计模式模式,允许在不对外暴露实现细节的情况下保存和恢复对象之前的状态。

    备忘录模式是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

    在这里插入图片描述

    Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻的内部状态,并且可以使用备忘录恢复内部状态。发起人可以决定Memento存储Originator的哪些内部状态。
    Memento(备忘录):负责存储Originator对象的内部状态,并且防止除了Originator的其他对象访问备忘录。

    备忘录有两个接口
    Caretaker(管理者)只能看到备忘录的窄接口,只能将备忘录传递给其他对象。负责保存备忘录,不能对备忘录的内容进行操作或检查。

    Originator能够看到一个宽接口,允许它访问到先前状态所需的所有数据。

    Memento模式适用于功能比较复杂,但是需要维护或者记录历史属性的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。

    #include 
    #include 
    
    using namespace std;
    
    
    // Memento类
    class Memento{
    public:
        Memento(int vik=100, int atk=100, int def=100):vik_(vik), atk_(atk), def_(atk){}
        int GetVik(){
            return vik_;
        }
        int GetAtk(){
            return atk_;
        }
        int GetDef(){
            return def_;
        }
    private:
        int vik_;
        int atk_;
        int def_;
    };
    
    // Originator类, 包含3个属性
    class Originator{
    public:
        // 初始化
        void InitState(){
            vik_ = 100;
            atk_ = 100;
            def_ = 100;
        }
        // 存档
        Memento* CreateMemento(){
            return (new Memento(vik_, atk_, def_));
        }
        // 调档
        void SetMemento(Memento *memento){
            vik_ = memento->GetVik();
            atk_ = memento->GetAtk();
            def_ = memento->GetDef();
        }
    
        // 战斗
        void Fight(){
            vik_ -= 50;
        }
    
        void show(){
            cout << "当前角色的状态为\n生命值: " << vik_ << "\n攻击力: " << atk_ << "\n防御值: " << def_ << endl;
        }
    
    private:
        int vik_;     // 生命值
        int atk_;     // 攻击
        int def_;     // 防御
    
    };
    
    // 管理者类
    class Caretaker
    {
    public:
        Memento *memento;
    };
    
    // 客户端代码
    void Client(){
        // 战斗之前
        Originator* Role = new Originator();
        Role->InitState();
        Role->show();
    
        // 存档
        Caretaker *stateAdmin = new Caretaker;      // 对外并不知道保存的内容
        stateAdmin->memento = Role->CreateMemento();
    
        // 战斗
        Role->Fight();
        Role->show();
    
        // 调档
        Role->SetMemento(stateAdmin->memento);
        Role->show();
    
        delete Role;
        delete stateAdmin;
    }
    
    int main(){
        Client();
        return 0;
    }
    

    输出为

    当前角色的状态为
    生命值: 100
    攻击力: 100
    防御值: 100
    当前角色的状态为
    生命值: 50
    攻击力: 100
    防御值: 100
    当前角色的状态为
    生命值: 100
    攻击力: 100
    防御值: 100
    
  • 相关阅读:
    网络安全、夺旗赛(CTF)技能汇总
    [附源码]计算机毕业设计面向高校活动聚AppSpringboot程序
    linux下软硬链接的解读的理解
    React笔记(六)React路由
    什么浏览器广告少?多御安全浏览器轻体验
    【计算机组成】实模式/保护模式下地址分段(基段地址+偏移地址)的原因
    【无标题】
    【小程序源码】圣诞节头像框制作生成支持多模板
    js对象相关操作
    T293037 [传智杯 #5 练习赛] 白色旅人
  • 原文地址:https://blog.csdn.net/weixin_42903300/article/details/139749408