设计模式 - 浅谈备忘录模式

备忘录模式

模式功能说明:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

模式思路与原理

备忘录模式涉及三种角色:

  • 发起人(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;
    }

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

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

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类可以创建一个备忘录,保存其当前状态,也可以使用备忘录恢复其内部状态。Memento类是一个备忘录,可以存储Originator的内部状态。CareTaker类可以保存备忘录,但不能对备忘录的内容进行操作。

使用场景:

  • 当需要保存一个对象在某一个时刻的状态或者备份一个对象的状态,以便在需要的时候恢复它。

优缺点

优点:

  1. 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
  2. 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
  3. 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。

缺点:

  1. 如果需要保存的状态数据过多,将会消耗大量的存储空间。
  2. 可能需要对备忘录进行深拷贝,以防原始对象变化时备忘录也随之变化。

总结

备忘录模式遵循了封装性原则,即外部对象不应该知道备忘录对象的实现细节。 备忘录模式是一种行为设计模式,主要用于保存和恢复对象的内部状态。它可以帮助我们实现撤销、回滚等操作,但需要注意的是,如果状态数据过多,将会消耗大量的存储空间。


本文链接:

https://pugqq.com/archives/memento-pattern.html
设计模式 - 浅谈备忘录模式 - I/O
快来做第一个评论的人吧~

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21