行为型模式-备忘录模式

发布于:2024-12-06 ⋅ 阅读:(37) ⋅ 点赞:(0)

备忘录模式(Memento Pattern)是一种行为型设计模式,旨在在不破坏封装性的前提下捕获对象的内部状态,并在需要时恢复到之前的状态。它主要用于保存和恢复对象的状态,常用于实现撤销操作或版本管理。

模式结构

备忘录模式包含以下三个主要角色:

  • Originator(发起人)
    定义一个对象,它的状态需要被保存和恢复。
    提供创建备忘录(保存状态)和恢复备忘录(还原状态)的方法。
  • Memento(备忘录)
    存储发起人的内部状态。
    通常是一个不透明对象,只有发起人能够访问其内容。
  • Caretaker(负责人)
    负责保存备忘录,但不能修改或访问备忘录的内容。

代码示例

// 备忘录类
class Memento {
    private 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;
        System.out.println("State set to: " + state);
    }

    public String getState() {
        return state;
    }

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

    public void setMemento(Memento memento) {
        state = memento.getState();
        System.out.println("State restored to: " + state);
    }
}

// 负责人类
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);
    }
}

// 测试代码
public class MementoPatternDemo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("State1");
        caretaker.addMemento(originator.createMemento());

        originator.setState("State2");
        caretaker.addMemento(originator.createMemento());

        originator.setState("State3");
        System.out.println("Current state: " + originator.getState());

        // 恢复状态
        originator.setMemento(caretaker.getMemento(0));
        System.out.println("Restored state: " + originator.getState());
    }
}

适用场景

  • 需要保存和恢复对象的状态。
  • 实现撤销操作功能。
  • 需要保存对象的历史版本。

优缺点

  • 优点
    提供了对象状态的快照功能。
    保持了对象的封装性。
  • 缺点
    如果需要保存的状态非常复杂,会消耗较多内存。
    负责人类需要管理多个备忘录,可能引入管理复杂性。