设计模式篇---备忘录模式

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

备忘录模式:在不破坏封装的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,像这样可以在以后将对象恢复到原先保存的状态。
就好比我们下象棋,下完之后发现走错了,想要回退到上一步,这就是备忘录模式的应用。
该设计模式的拉丁文为Memento,在拉丁语中为【记住】的意思,到中文就改为了【备忘录】。

结构

在这里插入图片描述
Originator(原发器):它是一个普通的类,通过创建一个备忘录来存储当前内部状态,也可以用备忘录来恢复其内部状态,一般将系统中需要保存内部状态的类设计为原发器。
Memento(备忘录): 备忘录用于存储原发器的内部状态,根据原发器来保存哪些内部状态。备忘录的设计一般可以参考原发器的设计,根据实际需要确定备忘录类中的属性,除了原发器和负责人类之外,备忘录对象不能直接供其他类使用。
Caretaker(负责人):它负责保存备忘录。在负责人类中可以存储一个或多个备忘录对象,它只负责存储对象,而不能修改对象,也无须知道对象的实现细节。

实例

现在来实现一个象棋的软件,通过备忘录模式可以实现“悔棋”的功能。
在这里插入图片描述
象棋类,充当原发器

public class Chessman {
    private String label;
    private int x;
    private int y;

    public Chessman(String label, int x, int y) {
        this.label = label;
        this.x = x;
        this.y = y;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public String getLabel() {
        return (this.label);
    }

    public int getX() {
        return (this.x);
    }

    public int getY() {
        return (this.y);
    }

    public ChessmanMemento save() {
        return new ChessmanMemento(this.label, this.x, this.y);
    }

    public void restore(ChessmanMemento memento) {
        this.label = memento.getLabel();
        this.x = memento.getX();
        this.y = memento.getY();
    }
}

ChessmanMemento类,充当象棋备忘录

public class ChessmanMemento {

    private String label;
    private int x;
    private int y;

    public ChessmanMemento(String label, int x, int y) {
        this.label = label;
        this.x = x;
        this.y = y;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public String getLabel() {
        return (this.label);
    }

    public int getX() {
        return (this.x);
    }

    public int getY() {
        return (this.y);
    }

    public ChessmanMemento save() {
        return new ChessmanMemento(this.label, this.x, this.y);
    }

    public void restore(ChessmanMemento memento) {
        this.label = memento.getLabel();
        this.x = memento.getX();
        this.y = memento.getY();
    }
}

MementoCaretaker类,象棋备忘录管理者,充当负责人

public class MementoCaretaker {
    private ChessmanMemento memento;

    public ChessmanMemento getMemento() {
        return memento;
    }

    public void setMemento(ChessmanMemento memento) {
        this.memento = memento;
    }
}

客户端

public class Client {

    public static void main(String[] args) {
        MementoCaretaker mc = new MementoCaretaker();
        Chessman chess = new Chessman("车", 1, 1);
        display(chess);
        mc.setMemento(chess.save()); //保存状态
        chess.setY(4);
        display(chess);
        mc.setMemento(chess.save()); //保存状态
        chess.setX(5);
        display(chess);
        System.out.println("******悔棋******");
        chess.restore(mc.getMemento()); //恢复状态
        display(chess);
    }

    public static void display(Chessman chess) {
        System.out.println("棋子" + chess.getLabel() + "当前位置为:" + "第" + chess.getX() + "行,第" + chess.getY() + "列。");
    }
}

打印结果
在这里插入图片描述

如果想做到批量回退,思路是在MementoCaretaker维护一个有序的list即可,用来存放ChessmanMemento对象。

总结

【原发器】就是我们要进行备份的东西,【备忘录】和【原发器】基本是一样的,只不过可以把它理解为【原发器】的备份,【负责人】就是客户端的入口,通过它来进行备份和保存,但是它关联的是【备忘录】,并不是【原发器】。
当我们保存一个对象在某一时刻的全部状态或部分状态,需要以后它能够恢复到先前的状态时,可以考虑备忘录模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/360341.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 中文件上传

Spring Boot 中文件上传 一、MultipartFile二、单文件上传案例三、多文件上传案例四、Servlet 规范五、Servlet 规范实现文件上传 上传文件大家用的最多的就是 Apache Commons FileUpload,这个库使用非常广泛。Spring Boot3 版本中已经不能使用了。代替它的是 Sprin…

记录 | ubuntu安装terminal并配置

安装 terminal sudo apt update sudo apt install terminator 重新打开终端就是了 配置,右键 -> 配置文件首选项 快捷键 新建窗口:CtrlShiftT关闭窗口:Ctrl_ShiftW水平划分窗口:CtrlShiftO垂直划分窗口:CtrlShi…

excel中去掉单元格中两个数字之间的空格

excel中去掉单元格中两个数字之间的空格 使用公式:SUBSTITUTE(A1," “,”") 解释:将A1单元格中的空格查找出来并去掉。

【React】在项目中使用阿里图标库

文章目录 打开阿里图标库 》 选择相应图标项目 选择Symbol格式,并复制链接 基于antd新建一个JS文件 MyIcon.js,并绑定上面复制的链接 import { createFromIconfontCN } from ant-design/icons;// 图标有更新时,需更新下面图标链接 export…

【数据结构之二叉树的构建和遍历】

数据结构学习笔记---009 数据结构之二叉树1、二叉树的概念和结构1.1、回顾二叉树的重要性质1.2、回顾二叉树的主要分类1.1、如何实现二叉树? 2、二叉树的实现2.1、二叉树的BinaryTree.h2.2、二叉树的BinaryTree.c2.2.1、二叉树的构建2.2.2、二叉树销毁2.2.3、二叉树…

【Time Series】LSTM代码实战

一、简介 还是那句话,"时间序列金融"是一个很有"钱"景的话题,还是想尝试采用Stock时间序列预测任务DeepLearning。本文提供了LSTM预测股票的源代码。 二、算法原理 长短期记忆网络(LSTM)是一种特殊的循环神经…

以“美”为鉴,探寻香港比特币现货ETF的未来发展

出品|欧科云链研究院 作者|Hedy Bi 根据The Block于1月29日的报道,嘉实国际成为了首家向香港证监会提交比特币现货ETF申请的机构。早在去年12月22日,香港证监会发布了《有关证监会认可基金投资虚拟资产的通函》,明确…

突破瓶颈,提升开发效率:Spring框架进阶与最佳实践-IOC

IOC相关内容 1.1 bean基础配置1.1.1 bean基础配置(id与class)1.1.2 bean的name属性步骤1:配置别名步骤2:根据名称容器中获取bean对象步骤3:运行程序 1.1.3 bean作用范围scope配置1.1.3.1 验证IOC容器中对象是否为单例验证思路具体实现 1.1.3.2 配置bean为非单例1.1.…

C++文件操作(1)

C文件操作 1.文本的写入及读取文本文件写入文本文件读取 2.二进制文件的写入及读取二进制文件写入二进制文件读取 3.小结 C也有处理文件的能力,其功能实现依赖文件流。文件流是C中用来处理文件输入输出的一种流类。文件流可以用于从文件中读取数据或将数据写入到文件…

开发工具git分支冲突解决

在团队协作的软件开发过程中,Git是一款广泛使用的版本控制系统。然而,当多个开发者同时修改同一文件或代码段时,就会产生分支冲突。解决这些冲突需要仔细的协调和技术知识。本篇博客将介绍Git分支冲突的解决方法,以及开发工具和最…

四工序开料机可以加工什么产品

四工序开料机是木工机械设备中一款重要设备,该设备主要的功能是开料、打孔、拉槽等,一机多用,凭借多功能的加工效果,实现高速加工的效果,那么这样的设备可以加工什么类型的产品呢?大家对此了解多少呢&#…

idea报错 :(java: 找不到符号)

java: 找不到符号 符号: 变量 adminService 位置: 类 com.example.controller.WebController 查到网上一个办法:因为项目是maven:先点clean在点package

anaconda离线安装包的方法

当设备没有网络时,可以使用有网络的设备先下载所需安装包,然后离线拷贝到需要安装的设备,最后安装。 一. 下载所需安装包 下载命令:使用pip download。详细描述参见pip download -h 以"blind-watermark"为例。 pip …

一站式在线协作办公软件ONLYOFFICE,协作更便捷

1、ONLYOFFICE是什么? ONLYOFFICE是一款功能强大的在线协作办公软件,可以创建编辑Word文档、Excel电子表格,PowerPoint(PPT)演示文稿、Forms表单等多种文件。ONLYOFFICE支持多个平台,无论使用的是 Windows、…

真机调试,微信小程序,uniapp项目在微信开发者工具中真机调试,手机和电脑要连同一个wifi,先清空缓存,页面从登录页进入,再点真机调试,这样就不会报错了

微信小程序如何本地进行真机调试?_unity生成的微信小程序怎么在电脑上真机测试-CSDN博客 微信小程序 真机调试 注意事项 uniapp项目在微信开发者工具中真机调试,手机和电脑要连同一个wifi,先清空缓存,页面从登录页进入&#xf…

怎么保护U盘数据?如何提高U盘的安全性?

U盘作为常用的移动储存设备,能够帮我们存储大量数据。而为了避免数据泄露,我们需要采用专业的方式提高U盘的安全性。那么,怎么保护U盘数据呢?下面我们就一起来了解一下。 如何提高U盘的安全性? 提高U盘数据安全性的方…

3DMAX一键生成样条线纤维插件使用方法

3DMAX一键生成样条线纤维插件使用教程 3DMAX一键生成样条线纤维插件,是一个强大的脚本工具,用于围绕选定的样条线路径创建纤维。它有许多设置用于微调纤维的形状和材质。 【适用版本】 3dMax2010 – 2024(不仅限于此范围) 【安装…

Rust基础篇之注释、函数

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期专栏回顾 专栏描述…

Wireshark网络协议分析 - UDP协议

在我的博客阅读本文 文章目录 1. 基础2. 实战2.1. 用Go写一个简单的UDP服务器与客户端2.2. Wireshark抓包分析 3. UDP与TCP的区别4. 参考资料 1. 基础 UDP包的数据结构: 2. 实战 2.1. 用Go写一个简单的UDP服务器与客户端 我们这里使用Golang写了一个简单的9830端…

appsmith安装手记:4.Sql server数据库容器安装

appsmith安装好,那就可以看是练练手。 数据当然是来自数据库,那就连接局域网中现成的一台数据库服务器试试,但是连接数据库的时候一直错误。 找到/home/appsmith/backend 目录下的日志,看到了错误: [rootlocalhost bac…