• java 之 备忘录模式(大话设计模式)


    备忘录模式,给笔者的感觉,我们在实际开发中很少用到,至少笔者是没用到过。一般在游戏后台开发应该会经常用到吧!当然这只是

    笔者的推断。先看下类图

    大话设计模式-类图

    再继续看下Demo吧

    /**
     * 需要保存的进度信息类
     */
    public class RoleSateMemento{
    
        private Integer atk;
    
        private Integer vit;
    
        private Integer attack;
    
        public RoleSateMemento(Integer atk, Integer vit, Integer attack) {
            super();
            this.atk = atk;
            this.vit = vit;
            this.attack = attack;
        }
    
        public Integer getAtk() {
            return atk;
        }
    
        public void setAtk(Integer atk) {
            this.atk = atk;
        }
    
        public Integer getVit() {
            return vit;
        }
    
        public void setVit(Integer vit) {
            this.vit = vit;
        }
    
        public Integer getAttack() {
            return attack;
        }
    
        public void setAttack(Integer attack) {
            this.attack = attack;
        }
    }
    /**
     * 存储进度类
     */
    public class RolerStateCaretaker {
    
        private RoleSateMemento roleSateMemento;
    
        public RoleSateMemento getRoleSateMemento() {
            return roleSateMemento;
        }
    
        public void setRoleSateMemento(RoleSateMemento roleSateMemento) {
            this.roleSateMemento = roleSateMemento;
        }
    }
    /**
     * 角色类
     */
    public class RolerInfo {
    
        private Integer atk;
    
        private Integer vit;
    
        private Integer attack;
    
        public RolerInfo(Integer atk, Integer vit, Integer attack) {
            super();
            this.atk = atk;
            this.vit = vit;
            this.attack = attack;
        }
    
        public static RolerInfo initRoler() {
            return new RolerInfo(100, 100, 100);
        }
    
        public void showState() {
            System.out.println("当前血量: " + vit);
            System.out.println("当前攻击力: " + atk);
            System.out.println("当前防御力: " + attack);
        }
    
        public RoleSateMemento saveRolerInfo() {
            return new RoleSateMemento(atk, vit, attack);
        }
    
        public void restoreMenmento(RoleSateMemento roleSateMemento) {
            this.vit = roleSateMemento.getVit();
            this.atk = roleSateMemento.getAtk();
            this.attack = roleSateMemento.getAttack();
        }
    
        public Integer getAtk() {
            return atk;
        }
    
    
        public void setAtk(Integer atk) {
            this.atk = atk;
        }
    
    
        public Integer getVit() {
            return vit;
        }
    
    
        public void setVit(Integer vit) {
            this.vit = vit;
        }
    
    
        public Integer getAttack() {
            return attack;
        }
    
    
        public void setAttack(Integer attack) {
            this.attack = attack;
        }
    }
    /**
     * 客户端
     */
    public class Test {
    
        public static void main(String[] args) {
            RolerInfo role = RolerInfo.initRoler();
            System.out.println("----------大战BOSS之前----------");
            role.showState();
    
            //保持进度
            RolerStateCaretaker caretaker = new RolerStateCaretaker();
            caretaker.setRoleSateMemento(role.saveRolerInfo());
    
            //大战BOSS
            role.setAtk(0);
            role.setAttack(0);
            role.setVit(0);
            System.out.println("----------大战BOSS----------");
            role.showState();
    
            //恢复存档
            role.restoreMenmento(caretaker.getRoleSateMemento());
            System.out.println("----------恢复----------");
            role.showState();
    
        }
    }

    运行结果

    ----------大战BOSS之前----------
    当前血量: 100
    当前攻击力: 100
    当前防御力: 100
    ----------大战BOSS----------
    当前血量: 0
    当前攻击力: 0
    当前防御力: 0
    ----------恢复----------
    当前血量: 100
    当前攻击力: 100
    当前防御力: 100

    简单看下记忆类和负责保存记忆的类,其实就是几个属性,然后还有set,get方法,并不复杂,主要的逻辑还是在角色类里。笔者之前看大话设计模式时

    一直误解为什么角色类里面的属性和记忆类里面的属性相同,而不让角色类继承记忆类呢? 后来仔细想下,原因是,角色里面有很多属性不需要保存。打个比方

    角色的性别不会因为大战BOSS之后就变性,所以性别并不需要保存,所以这里没有用继承,记忆只是负责保存需要保存的属性。

    以上是笔者对备忘录模式的理解,希望能帮助学习的小伙伴。另外笔者强烈推荐学习的小伙伴多看看大话设计模式,然后领悟其精髓,自己在手动写一次代码。

  • 相关阅读:
    dynamic load jar and init spring
    maven-assembly-plugin
    URL to load resources from the classpath in Java
    maven plugins
    URL加载jar
    spring自定义xml标签&自定义注解
    有序表查找---插值查找
    有序表查找---折半查找算法
    基本查找算法---顺序表查找
    图的基础---关键路径理解和实现(Java)
  • 原文地址:https://www.cnblogs.com/zhuxiansheng/p/8027025.html
Copyright © 2020-2023  润新知