设计模式-行为型模式-备忘录模式

news2024/11/18 19:50:07

1.备忘录模式定义

        在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态;

1.1 备忘录模式的优缺点

优点

  • 提供了一种状态恢复的实现机制,使得用户可以方便的回到一个特定的历史步骤,当新的状态无效或者存在问题的时候,可以使用暂时存储起来的备忘录将状态恢复;
  • 备忘录实现了对信息的封装,一个备忘录对象是一种发起者对象状态的表示,不会被其他代码所改动;

缺点

  • 资源消耗过大,如果需要保存的发起者类的成员变量比较多,就不可避免的需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源;

1.2 备忘录模式的使用场景

  • 需要保存一个对象在某一时刻的状态时,可以使用备忘录模式;
  • 不希望外界直接访问对象内部状态时;

2.备忘录模式的原理

  • 发起人(Originator):状态需要被记录的元对象类,记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,它可以访问备忘录里的所有信息;
  • 备忘录(Memento):负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人;
  • 看护人(Caretaker):对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改;

3.备忘录模式的实现

【实例】

        一个简单的吃金币的游戏,玩家通过掷骰子来决定下一状态,点数为1、3、5时金币增加对应数,点数为2、4、6时玩家减少对应金币,当金币为小于等于0时游戏重新开始;

【代码】

        备忘录:记录玩家的状态

public class Memento {
    int money;    //所持金钱
    //构造函数
    Memento(int money) {
        this.money = money;
        this.fruits = new ArrayList();
    }
    //获取当前玩家所有的金钱
    int getMoney() {
        return money;
    }
}

        发起人——玩家

public class Player {
    private int money;      //所持金钱
    private Random random = new Random();   //随机数对象
    //构造方法
    public Player(int money) {
        this.money = money;
    }
    //获取当前所持有的金钱
    public int getMoney() {
        return money;
    }
    //掷骰子游戏
    public void yacht(){
        int dice = random.nextInt(6) + 1;   //掷骰子
        switch(dice){
            case 1:
            case 3:
            case 5:
                money += dice;
                break;
            case 2:
            case 4:
            case 6:
                money -= dice;
                break;
            default:
                break;
        }
    }
    //拍摄快照
    public Memento createMemento(){
        Memento memento = new Memento(money);
        return memento;
    }
    //撤销方法
    public void restore(Memento memento){
        this.money = memento.money;
    }
    @Override
    public String toString() {
        return "Player{" +
                "money=" + money +
                '}';
    }
}

        看护人——客户端

public class MainApp {
    public static void main(String[] args) throws InterruptedException {
        Player player = new Player(100);        //最初所持的金钱数
        Memento memento = player.createMemento();       //保存最初状态
        for (int i = 0; i < 100; i++) {
            //显示扔骰子的次数
            System.out.println("=====" + i);
            //显示当前状态
            System.out.println("当前状态: " + player);
            //开启游戏
            player.yacht();
            System.out.println("所持有的金钱为: " + player.getMoney() + " 元");
            //决定如何操作Memento
            if(player.getMoney() > 0){
                System.out.println("赚到金币,保存当前状态,继续游戏!");
                memento = player.createMemento();
            }else {
                System.out.println("所持金币不足,游戏重新开始!");
                player.restore(memento);
            }
            Thread.sleep(1000);
            System.out.println("");
        }
    }
}

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

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

相关文章

社区营销:如何通过聚集人群提升品牌

“没有人是孤岛”&#xff0c;约翰多恩这样写道。如果可以&#xff0c;请忽略他的性别偏见。他写这句话是在1624年&#xff08;那时候真的不一样&#xff09;。尽管如此&#xff0c;几个世纪后&#xff0c;他的话依然铿锵有力&#xff1a;很少有人能够在孤独中茁壮成长。我们是…

Maven从入门到精通(二)

一、什么是pom.xml pom.xml是Maven项目的核心配置文件&#xff0c;它是 项目对象模型 - Project Object Model&#xff08;POM&#xff09;的缩写。POM定义了项目的所有属性&#xff0c;包括项目的名称、版本、依赖关系、构建配置等。使用pom.xml&#xff0c;我们可以轻松地管…

栈实现基本计算器

leetcode题目链接 这题其实和逆波兰表达式很像&#xff0c;无非多了个&#xff08;和&#xff09; 我们可以定义三个变量。 result表示当前计算结果 sign表示是还是- number表示当前数字 遍历字符串 利用isDigit 方法 提出数字 如果遇到加号resultsign*number 减号则将…

codeup:将已有文件夹推送到已有仓库

codeup&#xff1a;将已有文件夹推送到已有仓库 总流程git initgit remote add origin https://codeup.aliyun.com/xxx/xxx.gitgit add .git commit &#xff08;会遇到很多问题&#xff09;git push -u origin master &#xff08;会遇到很多问题&#xff09;成功在仓库中添加…

Unity 摄像机(Camera)详解

文章目录 0.前言1.相机属性介绍2.Unity 中多个相机画面堆叠显示2.1 3D 摄像机2.2 UI 摄像机2.3 摄像机的Culling Mask设置 0.前言 本文介绍的是使用Unity默认的内置渲染管线下的Camera组件&#xff0c;使用URP或HDRP则不同。 1.相机属性介绍 Clear Flags&#xff1a; 清除标记…

Java 创建对象内存分析

通过创建一个Pet类&#xff0c;以及new了两个Pet类的对象dog和cat来说明&#xff1a; 内存概念图&#xff1a;

揭秘!洞察用户心声的神秘策略,如何悄然引领业务爆炸式增长!

引言 在互联网和数字化技术的推动下&#xff0c;用户行为和消费模式发生了深刻变化。用户不再仅仅满足于产品的基本功能&#xff0c;而是更加关注个性化体验、情感连接和价值认同。因此&#xff0c;企业要想在激烈的市场竞争中脱颖而出&#xff0c;必须深入理解用户需求&#…

【解决方案】双系统中修复ubuntu引导

双系统中修复ubuntu引导 一、grub命令行进入ubuntu二、grub命令行进入windows三、可以进入windows的情况四、可以进入ubuntu的情况五、使用EasyUEFI软件编辑引导 windows安装ubuntu系统之后&#xff0c;无法进入系统选择界面&#xff0c;会出现以下几种情况。 一、grub命令行进…

【重学 MySQL】二十八、SQL99语法新特性之自然连接和 using 连接

【重学 MySQL】二十八、SQL99语法新特性之自然连接和 using 连接 自然连接&#xff08;NATURAL JOIN&#xff09;USING连接总结 SQL99语法在SQL92的基础上引入了一些新特性&#xff0c;其中自然连接&#xff08;NATURAL JOIN&#xff09;和USING连接是较为显著的两个特性。 自…

027.爬虫专用浏览器-绕过常见无头检测(二)

一、无头检测简介&#xff1a; 无头检测(Headless Detection)就是检测用户是否在无头浏览器。只要检测到&#xff0c;那百分百是爬虫。无头检测我们多数使用这个站&#xff1a;https://bot.sannysoft.com/之前写过一篇文章&#xff1a;插眼传送&#xff0c;绕过了部分检测&…

C盘空间不足如何解决?解决C盘空间不足的7个方法

当计算机的C盘&#xff08;通常作为系统盘&#xff09;空间不足时&#xff0c;会严重影响系统的运行效率和稳定性。针对这一问题&#xff0c;以下7个解决方案&#xff0c;可以帮助我们有效释放C盘空间&#xff0c;提升系统性能。 1.磁盘清理 利用Windows内置的磁盘清理工具…

【IPV6从入门到起飞】5-3 IPV6+Home Assistant(ESP32+MQTT+GPIO)远程控制灯

IPV6Home Assistant[ESP32MQTTGPIO]远程控制灯 1 背景2 Home Assistant 配置3 ESP32 配置3-1 工程代码3-2 硬件接线 4 实现效果 1 背景 在上一小节我们通过ESP32接入了Home Assistant&#xff0c;实现了温度、湿度、光照强度的数据采集&#xff0c;但智能家居更多的是实现控制…

IDEA 修改 ${USER} 配置

背景 安装了阿里巴巴代码规范插件&#xff0c;需要使用自动添加作者信息的功能 但是添加的是个人昵称&#xff0c;并非公司要求的工号等信息&#xff0c;于是需要做出修改 修改方案 历经一番波折后&#xff0c;终于发现其原理&#xff0c;是因为 插件添加作者信息&#xff0…

Version ‘18.19.0‘ not found - try `nvm ls-remote` to browse available versions.

nvm安装指定版本不好使了 使用 nvm install 18.19.0 一直报错 Version 18.19.0 not found - try nvm ls-remote to browse available versions.然而使用 nvm ls-remote 只看到 iojs-v1.0.0iojs-v1.0.1iojs-v1.0.2iojs-v1.0.3iojs-v1.0.4iojs-v1.1.0iojs-v1.2.0iojs-v1.3.0iojs…

GPU池化为实现Robotaxi按下快进键

日前&#xff0c;甲子光年智库推出《2022中国Robotaxi行业研究报告&#xff1a;探寻规模化商业落地之路》。Robotaxi&#xff08;无人驾驶出租车&#xff09;是自动驾驶技术发展应用的终极目标之一&#xff0c;新基建下的智慧共享出行将链接贯穿未来数智化生活全场景。 该报告从…

html限制仅有一个音/视频可播放

html限制仅有一个音/视频可播放 /** 多个音频仅能播放一个 */ function audiosPlay() {const audios document.getElementsByTagName(audio);const videos document.getElementsByTagName(video);function pauseAll() {var self this;[].forEach.call(audios, function (i) …

MySQL之对数据库和表的操作

目录 一、创建数据库 二、字符集和校验规则 1、查看系统默认字符集 2、查看系统默认的校验规则 3、查看数据库支持的字符集 4、查看数据库支持的字符集校验规则 5、校验规则对数据库的影响 三、操作数据库 1、查看数据库 2、查看创建语句 ​编辑 3、修改数据库 4、…

从键入网址到显示页面全流程(超详细版)

网络 &#x1f468;‍&#x1f3eb; 小林coding 键入网址到网页显示&#xff0c;期间发生了什么 HTTP【端口&#xff1a;80】 解析URL 协议Web服务器地址目录 文件名 生成请求报文 请求行 请求方法&#xff08;get、post …&#xff09;请求路径协议的版本&#xff08;HTTP/1…

品读 Java 经典巨著《Effective Java》90条编程法则,第4条:通过私有构造器强化不可实例化的能力

文章目录 【前言】欢迎订阅【品读《Effective Java》】系列专栏java.lang.Math 类的设计经验总结 【前言】欢迎订阅【品读《Effective Java》】系列专栏 《Effective Java》是 Java 开发领域的经典著作&#xff0c;作者 Joshua Bloch 以丰富的经验和深入的知识&#xff0c;全面…