备忘录模式是一种行为型设计模式,它允许在不暴露对象实现细节的情况下保存和恢复对象的状态。备忘录模式通常涉及三个主要角色:发起人(Originator)**、**备忘录(Memento)**和**负责人(Caretaker)

1. 发起人(Originator): 负责创建一个包含当前内部状态的备忘录,并可以使用备忘录恢复其内部状态。
public class Originator {
    private String state;

    public void setState(String state) {
        this.state = state;
    }

    public String getState() {
        return state;
    }

    public Memento saveStateToMemento() {
        return new Memento(state);
    }

    public void restoreStateFromMemento(Memento memento) {
        this.state = memento.getState();
    }
}

2. 备忘录(Memento): 存储发起人对象的内部状态,并可以防止发起人以外的对象访问备忘录的内部状态。
public class Memento {
    private String state;

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

    public String getState() {
        return state;
    }
}

3. 负责人(Caretaker): 负责保存备忘录,并在需要时将备忘录提供给发起人。
import java.util.ArrayList;
import java.util.List;

public class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();

    public void addMemento(Memento memento) {
        mementoList.add(memento);
    }

    public Memento getMemento(int index) {
        return mementoList.get(index);
    }
}

4. 客户端代码: 创建发起人对象、备忘录对象和负责人对象,通过负责人保存和恢复发起人的状态。
public class Client {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        // 设置状态并保存备忘录
        originator.setState("State 1");
        caretaker.addMemento(originator.saveStateToMemento());

        // 修改状态并保存备忘录
        originator.setState("State 2");
        caretaker.addMemento(originator.saveStateToMemento());

        // 恢复到第一个备忘录状态
        originator.restoreStateFromMemento(caretaker.getMemento(0));
        System.out.println("Current State: " + originator.getState());

        // 恢复到第二个备忘录状态
        originator.restoreStateFromMemento(caretaker.getMemento(1));
        System.out.println("Current State: " + originator.getState());
    }
}

在这个例子中,备忘录模式允许发起人保存其内部状态的快照,并在需要时还原到先前的状态。这对于实现撤销、恢复和历史记录等功能非常有用。


转载请注明出处:http://www.zyzy.cn/article/detail/13955/设计模式