[JAVA] Java设计模式初识之备忘录模式详解

1848 0
王子 2022-11-6 11:47:55 | 显示全部楼层 |阅读模式
目录

    简介典型实现总结
      优点缺点适用场景
    源码


简介

备忘录设计模式(Memento Design Pattern)也叫作快照(Snapshot)模式,主要用于实现防丢失、撤销、恢复等功能。
其定义是,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象先前的状态。

典型实现

首先,定义一个备忘录 Memento 类存储状态,其代码示例如下:
  1. public class Memento {
  2.     private String state;
  3.     public Memento(Originator o) {
  4.         this.state = o.getState();
  5.     }
  6.     public void setState(String State) {
  7.         this.state = state;
  8.     }
  9.     public String getState() {
  10.         return this.state;
  11.     }
  12. }
复制代码
然后,把需要被存储状态的对象称作为发起者,定义为 Originator 类,包含用于存储成员数据的属性,其代码示例如下:
  1. public class Originator {
  2.     private String state;
  3.     public Originator() {}
  4.     // 创建一个备忘录对象
  5.     public Memento createMemento() {
  6.         return new Memento(this);
  7.     }
  8.     // 根据备忘录状态恢复原发器状态
  9.     public void restoreMemento(Memento m) {
  10.         state = m.getState();
  11.     }
  12.     public void setState(String State) {
  13.         this.state = state;
  14.     }
  15.     public String getState() {
  16.         return this.state;
  17.     }
  18. }
复制代码
定义一个负责人 Caretaker 用于管理备忘录对象,其代码示例如下:
  1. public class Caretaker {
  2.     private Memento memento;
  3.     public Memento getMemento() {
  4.         return this.memento;
  5.     }
  6.     public void setMemento(Memento memento) {
  7.         this.memento = memento;
  8.     }
  9. }
复制代码
总结


优点

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

缺点

备忘录模式的主要缺点如下:
如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源

适用场景

备忘录模式的适用场景如下:
保存一个对象在某一时刻的全部状态或部分状态,方便后续实现恢复和撤销
防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象

源码

在 JDK 中 java.util.Date 通过自身内部的一个 Long 值来实现备忘录模式。
如下是源码部分:
  1. public class Date implements java.io.Serializable, Cloneable, Comparable<Date> {
  2.     private transient long fastTime;
  3.     public Date(long date) {
  4.         fastTime = date;
  5.     }
  6.     public long getTime() {
  7.         return getTimeImpl();
  8.     }
  9.     private final long getTimeImpl() {
  10.         if (cdate != null && !cdate.isNormalized()) {
  11.             normalize();
  12.         }
  13.         return fastTime;
  14.     }
  15. }
复制代码
到此这篇关于Java设计模式初识之备忘录模式详解的文章就介绍到这了,更多相关Java备忘录模式内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持中国红客联盟!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行