• 备忘录模式


    游戏角色状态恢复问题

    游戏角色有血条和蓝条,在大战boss前保存自身的状态(血量、蓝量),当大战之后血和蓝有所下降,将其恢复到原来的状态

    传统方案

    在这里插入图片描述

    问题分析

    1. 一个对象,就对应一个保存原始转台的对象,当游戏中的对象很多时,不利于管理,开销也很大
    2. 传统方式就是简单的做备份,new出另外一个对象出来,再把需要备份的数据复制到这个新对象,这就暴露的对象内部的细节

    备忘录模式

    基本介绍

    1. 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态
    2. 备忘录模式属于行为型模式

    原理

    在这里插入图片描述

    1. Originator:需要保存状态的对象
    2. Memento:备忘录对象,负责保存记录,即Originator的内部状态
    3. Caretaker:守护者对象,负责保存多个备忘录对象,使用集合管理,提高效率
    4. 如果希望保存多个Originator对象的不同时间的状态,只需要使用hashmap,根据时间作key,当前时间的所有对象状态集合作为value

    备忘录模式解决游戏角色状态恢复问题

    在这里插入图片描述

    /***
     * @author shaofan
     * @Description 备忘录模式解决游戏角色状态恢复问题
     */
    public class Game {
        public static void main(String[] args) {
            GameRole role = new GameRole(100,100);
            Caretaker caretaker = new Caretaker();
            caretaker.setMemento(role.createMemento());
            System.out.println(role);
            role.setBlood(10);
            role.setBlue(0);
            System.out.println(role);
            role.recover(caretaker.getMemento());
            System.out.println(role);
        }
    }
    
    class GameRole{
        private int blood;
        private int blue;
        public GameRole(int blood,int blue){
            this.blood = blood;
            this.blue = blue;
        }
    
        public int getBlood() {
            return blood;
        }
    
        public void setBlood(int blood) {
            this.blood = blood;
        }
    
        public int getBlue() {
            return blue;
        }
    
        public void setBlue(int blue) {
            this.blue = blue;
        }
    
        @Override
        public String toString() {
            return "GameRole{" +
                    "blood=" + blood +
                    ", blue=" + blue +
                    '}';
        }
    
        public Memento createMemento(){
            return new Memento(blood,blue);
        }
    
        public void recover(Memento memento){
            blood = memento.getBlood();
            blue = memento.getBlue();
        }
    }
    
    class Memento{
        private int blood;
        private int blue;
        public Memento(int blood,int blue){
            this.blood = blood;
            this.blue = blue;
        }
    
        public int getBlood() {
            return blood;
        }
    
        public void setBlood(int blood) {
            this.blood = blood;
        }
    
        public int getBlue() {
            return blue;
        }
    
        public void setBlue(int blue) {
            this.blue = blue;
        }
    }
    
    class Caretaker{
        private Memento memento;
        public void setMemento(Memento memento){
            this.memento = memento;
        }
        public Memento getMemento(){
            return memento;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94

    总结

    1. 备忘录模式提供了一种状态恢复机制,可以使用户能够比较方便的回到某个历史状态
    2. 实现了信息的封装,使得用户不需要关心状态的保存细节
    3. 如果类的成员变量较多,势必会占用比较大的资源,而且保存一次都会消耗一定的内存
    4. 适合的场景:游戏存档、windows中ctrl+z、浏览器的回退、数据库的事务管理
    5. 为了节省内存,可以和原型模式配合使用
  • 相关阅读:
    信息安全、网络安全以及数据安全三者之间的区别
    【力扣练习】找一个字符串中不含有重复字符的最长字串的长度
    计算CAF FV值的demo code
    全链路压测(10):测试要做的准备工作
    【Linux】开始使用gdb吧!
    安装 Red Hat Enterprise Linux 9.1 虚拟机
    idea里面完整创建maven项目(包含如何使用)
    Android切面编程实现(AOP)
    JMeter 扩展开发:扩展 TCP 取样器
    java毕业设计——基于java+Spring+JSP的宠物网站设计与实现(毕业论文+程序源码)——宠物网站
  • 原文地址:https://blog.csdn.net/m0_48468380/article/details/126584433