备忘录模式:保存对象状态

备忘录模式是一种行为型设计模式,用于保存对象的状态,以便在需要时恢复该状态。它通常用于撤销操作或回滚事务。

示例代码

// 被保存状态的对象
class Originator {
    private String state;

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

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

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

// 保存的状态
class Memento {
    private final String state;

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

    public String getState() {
        return state;
    }
}

// 管理所有保存的状态
class Caretaker {
    private final List<Memento> mementos = new ArrayList<>();
    private int currentIndex = -1;

    public void addMemento(Memento memento) {
        mementos.add(memento);
        currentIndex++;
    }

    public Memento undo() {
        if (currentIndex <= 0) {
            throw new IllegalStateException("Can not undo any further");
        }
        currentIndex--;
        return mementos.get(currentIndex);
    }

    public Memento redo() {
        if (currentIndex >= mementos.size() - 1) {
            throw new IllegalStateException("Can not redo any further");
        }
        currentIndex++;
        return mementos.get(currentIndex);
    }
}

使用备忘录模式,当需要保存当前状态时,Originator调用saveState()方法创建一个Memento对象,并将其传递给Caretaker进行管理。当需要恢复之前的某个状态时,Originator可以从Caretaker中获取相应的Memento对象,并将其传递给restoreState()方法进行恢复。

这个示例展示了一个简单的撤销和重做功能:每次保存状态时,都会将其加入到Caretaker中管理。当用户执行撤销操作时,Caretaker从历史记录中取出上一个状态的Memento对象,然后Originator使用该对象恢复状态;当用户执行重做操作时,则是取出下一个状态的Memento对象,并让Originator恢复其状态。

缺点: 耗费大,如果内部状态很多,再保存一份,无意要浪费大量内存。

posted @ 2023-06-12 17:53  穆海如枫  阅读(16)  评论(0)    收藏  举报