21、备忘录模式(Memento)

备忘录模式是一种行为设计模式,允许在不暴露对象内部状态的情况下,保存和恢复对象的状态。

特点:

1、封装性:备忘录模式将对象的状态封装在备忘录对象中,使得原始对象不需要了解备忘录的内部细节。
2、可恢复性:能够随时恢复到之前的状态。
3、简洁性:用户可以选择性地保存和恢复状态,灵活性高。

适合场景:

1、当需要提供撤销操作时,例如文本编辑器中的撤销和重做功能。
2、当需要保存对象的历史状态,便于后续的恢复。
3、游戏中的存档系统,允许玩家在不同状态之间切换。

例子

以下是一个简单的 C++ 示例,展示如何使用备忘录模式来实现文本编辑器的撤销功能:

//g++ -o test main.cpp 
#include <iostream>
#include <string>
#include <vector>

// 备忘录类
class Memento {
public:
    Memento(const std::string& state) : state(state) {}
    std::string getState() const { return state; }
private:
    std::string state;
};

// 原始类
class Editor {
public:
    void setText(const std::string& text) { this->text = text; }
    std::string getText() const { return text; }
    Memento save() const { return Memento(text); }
    void restore(const Memento& memento) { text = memento.getState(); }

private:
    std::string text;
};

// 管理者类
class History {
public:
    void push(const Memento& memento) { states.push_back(memento); }
    Memento pop() {
        if (states.empty()) throw std::out_of_range("No states to restore.");
        Memento memento = states.back();
        states.pop_back();
        return memento;
    }
private:
    std::vector<Memento> states;
};

// 客户端代码
int main() {
    Editor editor;
    History history;

    editor.setText("Hello, World!");
    history.push(editor.save()); // 保存状态

    editor.setText("Hello, Design Patterns!");
    std::cout << "Current Text: " << editor.getText() << std::endl;

    // 撤销到之前的状态
    editor.restore(history.pop());
    std::cout << "After Undo: " << editor.getText() << std::endl;

    return 0;
}

说明:
Memento:用于保存 Editor 的状态。
Editor:原始类,允许设置文本和保存/恢复状态。
History:管理者类,负责保存多个备忘录对象并提供恢复功能。
客户端代码:创建 Editor 和 History 对象,演示如何保存和恢复文本状态。
备忘录模式提供了一种优雅的方式来管理对象状态,使得实现撤销和恢复功能变得简单而高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值