备忘录模式,给笔者的感觉,我们在实际开发中很少用到,至少笔者是没用到过。一般在游戏后台开发应该会经常用到吧!当然这只是
笔者的推断。先看下类图
大话设计模式-类图
再继续看下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之后就变性,所以性别并不需要保存,所以这里没有用继承,记忆只是负责保存需要保存的属性。
以上是笔者对备忘录模式的理解,希望能帮助学习的小伙伴。另外笔者强烈推荐学习的小伙伴多看看大话设计模式,然后领悟其精髓,自己在手动写一次代码。