Skip to main content

备忘录模式

设计模式备忘录模式About 2 min

备忘录模式可以保持对象状态的快照,这样对象可以在不向外界公开其内容的情况下返回到它的最初状态。

20240128201341

备忘录模式的主要角色:

  • 发起人(Originator) - 需要保存状态的对象。它可以创建一个备忘录,用来记录当前时刻的内部状态。
  • 备忘录(Memento) - 用于存储发起人对象的内部状态。
  • 管理者(Caretaker) - 管理Memento角色,负责保存好备忘录。

代码实现

发起人

发起人持有需要保存的状态,并且提供创建备忘录,和恢复状态的方法。

public class Originator {

    private String state;

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

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

    public void setMemento(Memento memento) {
        // 恢复状态
        this.state = memento.getState();

    }

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

备忘录

备忘录中持有状态字段,用于记录发起人的状态。

public class Memento {
    
    private String state;

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

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

管理者

管理者通过mementoList记录所有的状态变化,可以将发起人的状态还原到任意时刻。

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

    public void add(Memento state) {
        mementoList.add(state);
    }

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

}

使用方法

通过发起人对象来创建备忘录,并且通过管理者对象来保存备忘录。

每次发起人状态改变的时候,我们都通过originator.createMemento创建当前状态的备忘录;之后通过caretaker.add记录备忘录。

状态还原时,通过caretaker.get获取某个时刻的备忘录,通过originator.setMemento恢复状态。

public class Client {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.setState("State #1");
        caretaker.add(originator.createMemento());
        originator.setState("State #2");
        caretaker.add(originator.createMemento());
        originator.setState("State #3");
        caretaker.add(originator.createMemento());

        originator.setMemento(caretaker.get(0));
        System.out.println(originator.getState());
        originator.setMemento(caretaker.get(1));
        System.out.println(originator.getState());
        originator.setMemento(caretaker.get(2));
        System.out.println(originator.getState());
        
    }
}

结果:

20240128232520

What do you think?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v3.0.0-alpha.10