• 初识设计模式 - 备忘录模式


    简介

    备忘录设计模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于实现防丢失、撤销、恢复等功能。

    其定义是,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象先前的状态。

    典型实现

    首先,定义一个备忘录 Memento 类存储状态,其代码示例如下:

    public class Memento {
    private String state;
    public Memento(Originator o) {
    this.state = o.getState();
    }
    public void setState(String State) {
    this.state = state;
    }
    public String getState() {
    return this.state;
    }
    }

    然后,把需要被存储状态的对象称作为发起者,定义为 Originator 类,包含用于存储成员数据的属性,其代码示例如下:

    public class Originator {
    private String state;
    public Originator() {}
    // 创建一个备忘录对象
    public Memento createMemento() {
    return new Memento(this);
    }
    // 根据备忘录状态恢复原发器状态
    public void restoreMemento(Memento m) {
    state = m.getState();
    }
    public void setState(String State) {
    this.state = state;
    }
    public String getState() {
    return this.state;
    }
    }

    定义一个负责人 Caretaker 用于管理备忘录对象,其代码示例如下:

    public class Caretaker {
    private Memento memento;
    public Memento getMemento() {
    return this.memento;
    }
    public void setMemento(Memento memento) {
    this.memento = memento;
    }
    }

    总结

    优点

    备忘录模式的主要优点如下:

    • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态
    • 实现了内部状态的封装,使得用户不需要关心状态的保存细节

    缺点

    备忘录模式的主要缺点如下:

    • 如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源

    适用场景

    备忘录模式的适用场景如下:

    • 保存一个对象在某一时刻的全部状态或部分状态,方便后续实现恢复和撤销
    • 防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象

    源码

    在 JDK 中 java.util.Date 通过自身内部的一个 Long 值来实现备忘录模式。

    如下是源码部分:

    public class Date implements java.io.Serializable, Cloneable, Comparable {
    private transient long fastTime;
    public Date(long date) {
    fastTime = date;
    }
    public long getTime() {
    return getTimeImpl();
    }
    private final long getTimeImpl() {
    if (cdate != null && !cdate.isNormalized()) {
    normalize();
    }
    return fastTime;
    }
    }
  • 相关阅读:
    AR远程辅助技术应用到气象部门有何好处?
    学习java第七十四天
    图神经网络 | Pytorch图神经网络ST-GNN
    iOS 面向对象与类
    整理了197个经典SOTA模型,涵盖图像分类、目标检测、推荐系统等13个方向
    JavaScript-day03学习(流程控制)
    C++:day5
    UBOOT编译--- make xxx_deconfig过程详解(一)
    pytorch代码实现之空间通道重组卷积SCConv
    【科学文献计量】GC.networkCoInvestigator()和GC.networkCoInvestigator()中的参数解释
  • 原文地址:https://www.cnblogs.com/fatedeity/p/16856567.html