设计模式学习(二十):备忘录模式

设计模式,学习,二十,备忘录,模式 · 浏览次数 : 34

小编点评

**备忘录模式** **作者:Grey原文地址:博客园:设计模式学习(二十):备忘录模式CSDN:设计模式学习(二十):备忘录模式备忘录模式是一种行为型模式,用于记录对象的某个瞬间,类似快照的功能,应用实例: * 游戏中的「后悔药」 * 打游戏时的存档 * Windows 操作系统里的撤销操作( ctr + z ) * 浏览器的后退功能 **基本概念** * 一个备忘录对象记录对象的某个瞬间的属性值。 * 备忘录对象可以从磁盘中加载或保存数据,从而恢复对象的状态。 **设计模式应用** * **游戏中的悔恨药** * 玩家在游戏中进行一些操作后,需要记录这些操作。 * 备忘录对象可以记录玩家的最后行动的属性值。 * 当玩家再次开始游戏时,从备忘录对象中加载这些属性值。 * **打游戏时的存档** * 当玩家打游戏时,需要记录游戏状态,如当前进度、分数等。 * 备忘录对象可以记录这些状态值。 * 当玩家退出游戏时,从备忘录对象中加载这些状态值。 * **撤销操作** * 当用户按下 Ctrl + z 键时,需要记录该操作的标识符。 * 备忘录对象可以记录这个标识符。 * 当用户想要撤销操作时,从备忘录对象中加载这个标识符,然后执行撤销操作。 * **浏览器的后退功能** * 当用户点击浏览器的后退按钮时,需要记录该操作的标识符。 * 备忘录对象可以记录这个标识符。 * 当用户想要返回页面之前,从备忘录对象中加载这个标识符,然后执行返回操作。 **代码示例** ```java public class Main { public static void main(String[] args) { Person person = new Person(); person.name = "zhangsan"; person.age = 12; // 将person对象序列化到文件 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("/tank.data"))) { oos.writeObject(person); } // 从文件中加载person对象 try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream("/tank.data"))) { Person myTank = (Person) oos.readObject(); System.out.println(myTank); } } } ``` **参考资料** * Effective Java中文版(第3版)Head First 设计模式设计模式-可复用面向对象软件的基础坦克大战-马士兵菜鸟教程-设计模式极客时间-设计模式之美-王争

正文

设计模式学习(二十):备忘录模式

作者:Grey

原文地址:

博客园:设计模式学习(二十):备忘录模式

CSDN:设计模式学习(二十):备忘录模式

备忘录模式

备忘录模式是一种行为型模式。

用于记录对象的某个瞬间,类似快照的功能,

应用实例:

  • 游戏中的「后悔药」;

  • 打游戏时的存档;

  • Windows 操作系统里的撤销操作( ctr + z );

  • 浏览器的后退功能。

一个简单的示例

通过序列化的方式将数据存盘,然后从盘中提取并反序列化数据。

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "zhangsan";
        person.age = 12;
        new Main().save(person);
        new Main().load();
    }

    public void save(Person person) {
        File c = new File("/tank.data");
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(c));) {
            oos.writeObject(person);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void load() {
        File c = new File("/tank.data");
        try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream(c));) {
            Person myTank = (Person) oos.readObject();
            System.out.println(myTank);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

注:其中的 Person 类需要实现序列化接口(即:实现 Serializable 接口)

public class Person implements Serializable {
    
 private static final long serialVersionUID = 8694061726340087034L;
 public String name;
    public int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

上述示例的 UML 图如下

image

备忘录模式应用

  • Spring 中 StateManageableMessageContext.createMessagesMemento() 方法

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

与设计模式学习(二十):备忘录模式相似的内容:

设计模式学习(二十):备忘录模式

设计模式学习(二十):备忘录模式 作者:Grey 原文地址: 博客园:设计模式学习(二十):备忘录模式 CSDN:设计模式学习(二十):备忘录模式 备忘录模式 备忘录模式是一种行为型模式。 用于记录对象的某个瞬间,类似快照的功能, 应用实例: 游戏中的「后悔药」; 打游戏时的存档; Windows

设计模式学习(二)工厂模式——抽象工厂模式+注册表

目录前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用简单工厂改进 对于缺点①,我们可以使用简单工厂的思路来改进抽象工厂的初版代码。对于上一篇文章中的例子,我们去除Came

设计模式学习(二)工厂模式——抽象工厂模式

目录背景抽象工厂模式优点与缺点参考文章 背景 现在我需要开发一个相机操作模块,它可能在Windows下运行,也可能在Linux下运行。由于在厂家提供的SDK中,Windows下的SDK和Linux下的SDK是有区别的,因此对于一个品牌的相机,我们要创建两个类去封装这两个不同平台下的API。 我们先使

设计模式学习(二)工厂模式——工厂方法模式+注册表

目录工厂方法模式的瑕疵注册表 工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式,示例的类图如下: 考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过程中,就需要加以判断。 例如,在我的例子中,要根据连接到主机的

设计模式学习(二):单例模式

设计模式学习(二):单例模式 作者:Grey 原文地址: 博客园:设计模式学习(二):单例模式 CSDN:设计模式学习(二):单例模式 单例模式 单例模式是创建型模式。 单例的定义:“一个类只允许创建唯一一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。”定

设计模式学习(二十一):命令模式

设计模式学习(二十一):命令模式 作者:Grey 原文地址: 博客园:设计模式学习(二十一):命令模式 CSDN:设计模式学习(二十一):命令模式 命令模式 命令模式是一种行为型模式。 通过调用者调用接受者执行命令,执行顺序是: 调用者→命令→接受者 ```, 如下示例,CopyCommand 中的

设计模式学习(二十二):解释器模式

设计模式学习(二十二):解释器模式 作者:Grey 原文地址: 博客园:设计模式学习(二十二):解释器模式 CSDN:设计模式学习(二十二):解释器模式 解释器模式 解释器模式是一种行为型模式。 解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。 一般用于脚本语言

设计模式学习(二十三):中介模式

设计模式学习(二十三):中介模式 作者:Grey 原文地址: 博客园:设计模式学习(二十三):中介模式 CSDN:设计模式学习(二十三):中介模式 中介模式 中介模式是一种行为型模式。 举个简单的例子,如果一个聊天室里面的用户1和用户2要聊天,聊天室就相当于中介的地位,用户1和用户2只管调用发消息方

设计模式学习(二十四):Spring 中使用到的设计模式

设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring 中使用到的设计模式 观察者模式 定义一个继承 ApplicationEvent 的事件;定义一个实现

【23种设计模式】工厂方法模式(二)

## 前言 在讲述之工厂方法模式前,我们来先了解简单工厂模式,简单工厂模式是最简单的设计模式之一,它虽然不属于GoF的23种设计模式,但是应用也较为频繁,同时它也是学习其他创建型模式的基础。下面我们来先了解下简单工厂模式,然后针对它的缺点来引出工厂方法模式。 ## 简单工厂模式定义 **简单工厂模式