备忘录模式

发布于:2025-05-19 ⋅ 阅读:(20) ⋅ 点赞:(0)

1.意图

        备忘录模式是一种行为型设计模式,允许在不破坏封装的特性前提,获取并保存一个对象的内部状态,后续需要时恢复该状态。核心是将对象的状态存储在一个独立的备忘录对象中,并在需要时恢复。

2.模式类型

       行为型对象设计模式

3.UML图

上述类的表示:

        a.Originator 负责创建 Memento 并恢复状态。

        b.Caretaker 存储多个 Memento,但不修改其内容。

        c.Memento 仅提供 getState() 方法,确保封装性。

4.优缺点

        优点:

        提供了恢复状态机制,且保持对象的封装性,支持撤销操作。

        缺点:

        耗费内存,且增加了代码的复杂度,频繁的操作性能下降。

5.示例代码

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

// 备忘录类(存储 Originator 的状态)
class Memento {
private:
    std::string state;  // 保存的状态

public:
    Memento(const std::string& state) : state(state) {}
    std::string getState() const { return state; }
};

// 原发器类(需要保存状态的对象)
class Originator {
private:
    std::string state;

public:
    void setState(const std::string& newState) {
        std::cout << "Originator: Change state to " << newState << std::endl;
        state = newState;
    }

    // 创建备忘录(保存当前状态)
    Memento save() {
        return Memento(state);
    }

    // 恢复备忘录(恢复之前的状态)
    void restore(const Memento& memento) {
        state = memento.getState();
        std::cout << "Originator: Restored state to " << state << std::endl;
    }

    void printCurrentState(){
        std::cout << "Originator: current state is  " << state << std::endl;
    }
};

// 管理者类(存储备忘录)
class Caretaker {
private:
    std::vector<Memento> mementos;

public:
    void addMemento(const Memento& memento) {
        mementos.push_back(memento); // 每个状态都对应一个Memento类
    }

    Memento getMemento(int index) {
        return mementos.at(index);
    }
};

// 客户端代码
int main() {
    Originator originator;
    Caretaker caretaker;

    for(auto i = 0;i < 5;++i)
    {
        // 设置状态并保存
        std::stringstream  ss;
        ss << i;
        std::string strStat = "State #" + ss.str();
        originator.setState(strStat);
        caretaker.addMemento(originator.save());
    }
    
    originator.printCurrentState();

    // 恢复到第一个状态
    originator.restore(caretaker.getMemento(3));

    return 0;
}

输出:
root@ubuntu:~/mySpace/design_m_c++/disign_modle/Beiwanglu# ./a.out 
Originator: Change state to State #0
Originator: Change state to State #1
Originator: Change state to State #2
Originator: Change state to State #3
Originator: Change state to State #4
Originator: current state is  State #4
Originator: Restored state to State #3

综上即为备忘录模式特点。 


网站公告

今日签到

点亮在社区的每一天
去签到