从JDK中学习设计模式——备忘录模式

289 阅读2分钟

这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

概述

备忘录模式(Memento Pattern)在不破坏封装性的前提下捕获一个对象内部的状态,并在对象之外保存这个状态,以便对象以后恢复到这一状态。一般是通过快照的方式来记录用户的状态,因此又称为快照模式(Snapshot Pattern)或标记模式,它是一种对象行为模式

结构

中介者模式UML.png

  • Originator(原发器):一般将需要保存内部状态的类设计为原发器,可以用来创建备忘录,并存储其当前状态
  • Memento(备忘录):存储原发器的内部状态,根据这个类来决定保存哪些内部状态,不能直接被除原发器与负责人类之外的其他类使用
  • Caretaker(负责人):只能用来存储备忘录对象,而不能对备忘录的内容进行修改。

优点

  1. 可以很方便的使对象恢复到某个历史状态,从而实现撤销的操作。
  2. 实现了信息的封装,用户不必关心状态的保存细节,符合迪米特法则

缺点

  1. 为了实现历史状态的恢复,必须保存对象所有的变化状态,会消耗一定的系统资源
  2. 负责人可以存储一个或多个备忘录对象,会导致该类过于复杂。
  3. 备忘录对象被创建出来就是因为“最近”要使用,若不使用就必须删除其引用,因此必须主动去管理备忘录对象的生命周期

应用场景

  1. 需要实现回滚或撤销操作。
  2. 需要监控的副本场景中,例如数据库的日志。
  3. 需要对对象的历史状态进行保护,防止外界对象的破坏。

JDK 中的应用场景

在 JDK 中 java.util.Datejava.io.Serializable 都使用了备忘录模式。

public class Date
    implements java.io.Serializable, Cloneable, Comparable<Date>
{
    // 用于存储状态
    private transient long fastTime;
}