小侃设计模式(十六)-备忘录模式

news2024/11/25 2:49:06

1.概述

备忘录模式(Memento Pattern)是一种行为型模式,它的主要思想是在不破坏封装性的前提下,捕获一个对象的内部状态,并将该状态保存在该对象之外,这样以后就可将该对象恢复到原先保存的状态。它是相对简单的一种设计模式,能够允许用户取消不确定或者错误的操作,能够恢复到之前的状态。本文将详述备忘录模式的原理及使用方式。

2.原理及使用

2.1 原理

备忘录模式的UML类图如下所示:
在这里插入图片描述
备忘录模式主要包含三个核心角色:Originator(发起人)、Memento(备忘录)、Caretaker(管理者)。

Originator(发起人):负责创建一个备忘录对象,用来记录当前时刻的内部状态,并可使用备忘录恢复状态;
Memento(备忘录): 备忘录对象,负责保存好记录,即Originator内部状态;
Caretaker(管理者):守护者对象,负责保存多个备忘录对象。

2.2 案例

游戏角色有攻击力和防御力,在大战Boss前保存自身的攻击力和防御力,在于Boss大战时攻击力和防御力会下降,大战完成后攻击力恢复,要求从备忘录对象恢复到大战前的状态。根据案例,结合备忘录模式,得出类图如下:
在这里插入图片描述
编码如下:

public class Originator {

    private Integer attack;

    private Integer defence;

    public Originator(Integer attack, Integer defence) {
        this.attack = attack;
        this.defence = defence;
    }

    public synchronized Memento createMemento() {
        return new Memento(attack, defence);
    }

    public void recoveryFromMemento(Memento memento) {
        this.attack = memento.getAttack();
        this.defence = memento.getDefence();
    }

    public Integer getAttack() {
        return attack;
    }

    public void setAttack(Integer attack) {
        this.attack = attack;
    }

    public Integer getDefence() {
        return defence;
    }

    public void setDefence(Integer defence) {
        this.defence = defence;
    }

    public void display() {
        System.out.println("当前人物攻击力为:" + getAttack() + ",当前任务防御力为:" + getDefence());
    }
}

public class Memento {

    private Integer attack;

    private Integer defence;

    public Memento(Integer attack, Integer defence) {
        this.attack = attack;
        this.defence = defence;
    }

    public Integer getAttack() {
        return attack;
    }

    public void setAttack(Integer attack) {
        this.attack = attack;
    }

    public Integer getDefence() {
        return defence;
    }

    public void setDefence(Integer defence) {
        this.defence = defence;
    }
}

public class Caretake {

    private HashMap<String, Memento> mementoHashMap = new HashMap<>();

    public void add(String key, Memento memento) {
        mementoHashMap.put(key, memento);
    }

    public Memento get(String key) {
        return mementoHashMap.get(key);
    }
}


public class Client {
    public static void main(String[] args) {
        //打boss前状态
        Originator originator = new Originator(100, 100);
        Caretake caretake = new Caretake();
        caretake.add("beforeBoss", originator.createMemento());
        System.out.print("攻击Boss前------");
        originator.display();

        //打boss后的状态
        originator.setAttack(50);
        originator.setDefence(30);
        caretake.add("afterBoss",originator.createMemento());
        System.out.print("攻击Boss后------");
        originator.display();

        //恢复打boss之前的状态
        originator.recoveryFromMemento(caretake.get("beforeBoss"));
        System.out.print("恢复后------");
        originator.display();
    }
}

运行结果如下:
在这里插入图片描述

2.3 备忘录模式的优缺点

2.3.1 优点

1.封装信息更加方便,使用者不需要知道封装的具体细节及实现;
2.便于信息的快速恢复,且能够方便地恢复到指定历史状态。

2.3.2 缺点

1.如果类状态信息较多,会占用大量内存,如果这样的实例过多,可能会导致内存溢出。

2.4 使用场景

包括游戏时存档、IE中的后退模式、数据库事务管理、Windows的回退功能。

3.小结

1.备忘录模式是一种快速恢复对象历史状态的一种模式,
2.为了节约内存,备忘录可以与原型模式结合使用。

4.参考文献

1.《设计模式之禅》-秦小波著
2.《大话设计模式》-程杰著
3.https://www.runoob.com/design-pattern/memento-pattern.html
4.https://www.bilibili.com/video/BV1G4411c7N4-尚硅谷设计模式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【项目问题】程序里,oracle相关的内容,为什么有些能显示表有些不能显示表,但是用oracle工具就可以看到所有表

运行过程中的问题客户提出问题找一下原因问题找到了那如何解决这个看不到的问题呢客户提出问题 1、oracle数据源链接成功了&#xff0c;但是在产品使用过程中发现&#xff0c;没有表&#xff0c;空空如也 找一下原因 先看一下用户&#xff1a;zd202207 2、再去看看数据库工…

效率倍增!5款超级好用的Python工具库!

Python 是一门简单易学却功能非常强大的语言。好玩实用的工具层出不穷&#xff0c;也给我们的工作生活带来极大的方便。在之前文章中我已多次分享过一些实用的工具&#xff0c;有兴趣的可以翻阅一下&#xff0c;今天我再分享 5 款非常实用的工具: LuxTranslatorsTextShotFancy…

C规范编辑笔记(六)

往期文章&#xff1a; C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) 正文&#xff1a; 今天我们继续来分享一下我们C规范编辑笔记第六篇~ 话不多说&#xff0c;我们直接来看&#xff1a; 1、 结构体变量不得在未指定初始化…

华为云大数据BI 为中小型企业智慧运营保驾护航

华为云大数据BI 为中小型企业智慧运营保驾护航 企业数字化转型中&#xff0c;必然面临信息数据潜在价值变现的问题&#xff0c;在解决这一问题的途中&#xff0c;企业可能面临多种困难&#xff0c;尤其是信息数据分析&#xff0c;这直接关系到企业能否实现潜在价值变现。对于小…

[附源码]Python计算机毕业设计Django疫情管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

chrome新特性-recorder

chrome新特性-recorder一、简介二、录制三、录制回放1.Chrome DevTool工具2.Puppeteer脚本(1) 介绍(2) 使用一、简介 recorder 与Selenium IDE浏览器插件类似&#xff0c;可用于自动化测试及脚本生成(Puppeteer脚本);前者为Web自动化测试框架Selenium的配套浏览器插件支持Java、…

一文学会所有Web应用安全知识点

据调查大部分网络安全事故是软件缺陷导致的网络攻击。由于应用程序代码漏洞和安全漏洞&#xff0c;我们的企业正在遭受越来越多的攻击。调查显示攻击者可以通过盗用凭证&#xff0c;攻击10个测试过的web应用程序中的9个&#xff0c;进行恶意软件注入以及网络钓鱼攻击。因此&…

QuTrunk与MindSpore量子神经网络初探

QuTrunk是启科量子开发和已经开源的一款量子编程框架软件产品&#xff0c;关于QuTrunk的详细介绍&#xff0c;用户可以访问启科的开发者社区站点详细了解&#xff0c;也可以进入github上此项目下进行查询。 QuTrunk开发框架是可以与第三方AI框架深度结合进行量子计算程序开发的…

安装 Unity 个人免费版

安装 Unity 个人免费版 正版是需要收费的&#xff0c;所以我们个人开发使用个人免费版就可以 一、下载Unity 1.打开unity官网 点击”下载Unity" 官网 https://unity.cn/releases 2.下拉&#xff0c;会有各种版本&#xff0c;进入Unity的下载页面&#xff0c;找到对应的版…

Nacos2.1.2+Seata1.5.2+Mysql8+SpringCloud+Feign实现分布式事务笔记

搭建环境可以使用docker或是手动自己构建 1.启动nacos服务&#xff0c;nacos/nacos登录http://nacos-ip:8848 2.修改Seata的配置文件&#xff0c;注册到nacos上&#xff1a; seata\conf\application.yml server:port: 7091spring:application:name: seata-serverlogging:con…

VS调试安卓Unity应用

最近遇到了一个bug&#xff0c;需要在安卓手机上实机调试才行&#xff0c;所以这里记录一下怎么用VS调试安卓应用。我使用的VS是2017&#xff0c;但是更新的2019等版本应该也是差不多的&#xff08;毕竟实际上依赖的是Visual Studio Tools for Unity插件&#xff09;。Unity版本…

管理RMAN备份_管理恢复目录(Recovery Catalog)

本章阐述如何管理RMAN恢复目录。Catalog是一个数据库模式&#xff0c;它包含一个或多个目标数据库的RMAN仓库数据。 1&#xff0e;RMAN恢复目录概述 本节阐述与管理恢复目录相关的基本概念。 1.1&#xff0e;RMAN恢复目录的目的 恢复目录是一个数据库模式&#xff0c;RMAN使…

OutOfMemory内存溢出问题排查

OutOfMemory内存溢出问题排查 错误 2022-12-06 00:43:53.296[,] [registrationTask1] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler.handleError96 - Unexpected error occurred in scheduled task. java.lang.OutOfMemoryError: Java heap space 2022-12-06 00:42:49.…

密码技术学习一:密码

0、前言 本文是作者阅读《图解密码技术》时&#xff0c;学习总结的一些知识&#xff0c;在此推荐想要深入学习密码知识的同志&#xff0c;将此书作为入门书来看还是比较适合的。 1、密码技术简介 1.1加密与解密 在两者通信过程中&#xff0c;不想通信的内容被第三方知道&am…

在R语言中进行缺失值填充:估算缺失值

介绍 缺失值被认为是预测建模的首要障碍。因此&#xff0c;掌握克服这些问题的方法很重要。最近我们被客户要求撰写关于缺失值处理的研究报告&#xff0c;包括一些图形和统计输出。 估算缺失值的方法的选择在很大程度上影响了模型的预测能力。在大多数统计分析方法中&#xf…

有状态软件如何在 k8s 上快速扩容甚至自动扩容

概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机安装依赖下载安装包按规范配置主机名, hosts配置网络: 包括域名, DNS, 虚 ip, 防火墙...配置监控 今天虚机环境上出现了问题, 是因为 RabbitMQ 资源不足. 手动扩容…

一夜之间火爆GitHub的JavaWeb轻量级开发面试教程,终于浮出水面

前言 学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生…

[附源码]Python计算机毕业设计Django医院门诊管理信息系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

React组件通信

react因为组件化&#xff0c;使得组件间通信十分的重要。本文就来简单介绍一些常见的react组件间传递的内容。 我将归纳为以下几种关系来详述:父组件与子组件之间&#xff0c;子组件与父组件之间&#xff0c;发布者与订阅者模式&#xff08;context&#xff09;&#xff0c;兄弟…

Netty入门——基于NIO实现机器客服案例

Netty简单案例前言环境准备前置知识网络传输的几种实现方式BIO——同步阻塞IONIO——同步非阻塞IOAIO——异步非阻塞IO适用范围Netty简介特点核心组件使用场景运行简图案例简介关键代码客户端服务器端运行状况总结前言 最近学完了Netty&#xff0c;在这里关于Netty中实现NIO做…