备忘录模式是一种行为型设计模式,用于在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后可以将该对象恢复到之前的状态。这种模式通常用于需要记录对象状态历史、撤销操作或实现“回到过去”功能的场景。
在备忘录模式中,主要有三种角色:
① 备忘录(Memento):负责存储原发器(Originator)对象的内部状态。备忘录可以根据原发器提供的接口,获取状态或者恢复状态。
② 原发器(Originator):负责创建备忘录,并记录当前内部状态到备忘录中,或者从备忘录中恢复状态。
③ 管理者(Caretaker):负责保存备忘录对象,但是不能对备忘录的内容进行操作或者检查。
备忘录模式可以让对象在不暴露其实现细节的情况下,保存和恢复其内部状态,从而提供了更好的封装性和灵活性。

1、场景设计

实现场景:设计备忘录、原发器、管理者,操作一个字符串的备忘与恢复。

2、C++实现

`Memento` 类代表备忘录,`Originator` 类是原发器,负责创建备忘录和恢复状态,`Caretaker` 类是管理者,负责保存备忘录。在 `main` 函数中,我们演示了如何使用备忘录模式来保存对象的状态,并在需要时恢复到之前的状态。 

#include <iostream>
#include <string>

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

// 原发器类
class Originator {
    private:
        std::string state;

    public:
        void setState(const std::string& s) {
            state = s;
        }

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

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

        void restoreFromMemento(const Memento& m) {
            state = m.getState();
        }
};

// 管理者类
class Caretaker {
    private:
        Memento memento;

    public:
        void saveMemento(const Memento& m) {
            memento = m;
        }

        Memento retrieveMemento() const {
            return 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.restoreFromMemento(caretaker.retrieveMemento());
    std::cout << "Restored state: " << originator.getState() << std::endl;

    return 0;
}

3、Java实现

package behavioralpattern.memento;
// 备忘录类
class Memento {
    private final String state;

    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
}

// 原发器类
class Originator {
    private String state;
    public void setState(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
    public Memento createMemento() {
        return new Memento(state);
    }
    public void restoreFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// 管理者类
class Caretaker {
    private Memento memento;
    public void saveMemento(Memento memento) {
        this.memento = memento;
    }
    public Memento retrieveMemento() {
        return memento;
    }
}

public class MementoDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
        // 设置初始状态
        originator.setState("State 1");
        System.out.println("Current state: " + originator.getState());
        // 创建备忘录并保存
        caretaker.saveMemento(originator.createMemento());
        // 修改状态
        originator.setState("State 2");
        System.out.println("Current state: " + originator.getState());
        // 恢复到之前的状态
        originator.restoreFromMemento(caretaker.retrieveMemento());
        System.out.println("Restored state: " + originator.getState());
    }
}

`Memento` 类代表备忘录,`Originator` 类是原发器,负责创建备忘录和恢复状态,`Caretaker` 类是管理者,负责保存备忘录。在 `main` 方法中,我们演示了如何使用备忘录模式来保存对象的状态,并在需要时恢复到之前的状态。

04-17 08:08