备忘录模式

备忘录模式属于行为型模式

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

其实就是在某个时刻备份了对象的状态,在更改对象状态后,可以通过备份将对象还原成备份时刻的状态

模式类图

角色

  1. 原始对象:Originator 原对象,提供创建备份,和恢复备份数据功能
  2. 备忘录:Memento负责存储Originator对象的内部状态,在需要的时候提供发起人需要的内部状态
  3. 备忘录管理员:Caretaker对备忘录进行管理、保存和提供备忘录

优点

  1. 提供一种可以备份恢复的机制,客户端可以方便的恢复某个历史状态
  2. 封装性好,客户端不需要关心状态的保存细节

缺点

如果状态太多,会导致类膨胀

模式代码实现

源码地址:https://github.com/mingyuHub/design-patterns

原始对象

提供创建备份,和恢复备份数据功能

/**
 * @author: chenmingyu
 * @date: 2019/3/25 20:42
 * @description: 原始对象
 */
@Data
public class Originator{

    private String name;

    /**
     * 创建备忘录
     * @return
     * @throws CloneNotSupportedException
     */
    public Memento createMemento(){
        return new Memento(this.getName());
    }

    /**
     * 恢复一个备忘录
     * @param memento
     */
    public void restoreMemento(Memento memento){
        this.setName(memento.getName());
    }

    public Originator(String name) {
        this.name = name;
    }
}
备忘录

负责存储Originator的内在状态

/**
 * @author: chenmingyu
 * @date: 2019/3/25 20:47
 * @description: 备忘录
 */
@Data
public class Memento {

    private String name;

    public Memento(String name) {
        this.name = name;
    }
}
备忘录管理员

持有Mementod的实例

/**
 * @author: chenmingyu
 * @date: 2019/3/25 20:57
 * @description: 备忘录管理员
 */
@Data
public class Caretaker {

    private Memento memento;

    public Caretaker(Memento memento) {
        this.memento = memento;
    }
}
验证
public static void main(String[] args) {
    Originator originator = new Originator("mingyu");
    Caretaker caretaker = new Caretaker(originator.createMemento());
    System.out.println(originator.getName());
    System.out.println("……");

    originator.setName("wuwu");
    System.out.println(originator.getName());

    System.out.println("……");
    originator.restoreMemento(caretaker.getMemento());
    System.out.println(originator.getName());
}

输出

mingyu
……
wuwu
……
mingyu

参考:设计模式之禅:https://www.kancloud.cn/sstd521/design/193597

推荐阅读:23种设计模式详解