(三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

目录

1、备忘录模式(Memento Pattern)含义

2、备忘录模式的UML图学习

3、备忘录模式的应用场景

4、备忘录模式的优缺点

(1)优点:

(2)缺点

5、C++实现备忘录模式的实例


1、备忘录模式(Memento Pattern)含义

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

备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下捕获和存储一个对象的内部状态,并在需要时恢复该状态。它将对象的状态保存到备忘录对象中,然后可以通过备忘录对象来还原对象的状态。

2、备忘录模式的UML图学习

 备忘录模式的主要角色包括:

(1)Originator(发起人):负责创建一个备忘录对象,用于记录当前对象的内部状态,并可以使用备忘录对象来恢复其状态。

(2)Memento(备忘录):用于存储Originator对象的内部状态。

(3)Caretaker(管理者):负责保存备忘录对象,但不能对备忘录对象进行修改或检查。

3、备忘录模式的应用场景

(1)需要保存和恢复对象的历史状态。

(2)需要提供撤销操作或者回滚操作的系统。

(3)需要对对象的状态进行快照并进行比较的系统。

4、备忘录模式的优缺点

(1)优点:

        1)提供了一种可靠的方式来保存和恢复对象的状态,避免了直接暴露对象的内部细节。

        2)备忘录对象与原始对象解耦,使得原始对象可以专注于业务逻辑,而不必关心状态的保存和恢复。

        3)可以灵活地扩展备忘录对象的功能,例如支持多个历史状态的保存和恢复。

(2)缺点

        1)如果原始对象的状态较大或者频繁改变,会占用较大的内存空间。

        2)在保存和恢复状态时,需要进行对象的序列化和反序列化操作,可能会影响性能。

5、C++实现备忘录模式的实例


#include <iostream>
#include <string>

// 备忘录类
class Memento {
public:
    Memento(const std::string& state) : state_(state) {}

    std::string getState() const {
        return state_;
    }

private:
    std::string state_;
};

// 发起人类
class Originator {
public:
    void setState(const std::string& state) {
        state_ = state;
    }

    std::string getState() const {
        return state_;
    }

    Memento createMemento() {
        return Memento(state_);
    }

    void restoreMemento(const Memento& memento) {
        state_ = memento.getState();
    }

private:
    std::string state_;
};

// 管理者类
class Caretaker {
public:
    void saveMemento(const Memento& memento) {
        memento_ = memento;
    }

    Memento retrieveMemento() const {
        return memento_;
    }

private:
    Memento memento_;
};

int main() 
{
    Originator originator;
    Caretaker caretaker;

    // 设置初始状态
    originator.setState("State 1");
    std::cout << "Current state: " << originator.getState() << std::endl;

    // 保存状态
    caretaker.saveMemento(originator.createMemento());

    // 修改状态
    originator.setState("State 2");
    std::cout << "Current state: " << originator.getState() << std::endl;

    // 恢复状态
    originator.restoreMemento(caretaker.retrieveMemento());
    std::cout << "Restored state: " << originator.getState() << std::endl;

    return 0;
}

在上述示例中,Originator类表示发起人,Caretaker类表示管理者,Memento类表示备忘录。通过调用createMemento方法可以创建一个备忘录对象,并通过restoreMemento方法来恢复对象的状态。

猜你喜欢

转载自blog.csdn.net/bigger_belief/article/details/132414186