备忘录模式,给笔者的感觉,我们在实际开发中很少用到,至少笔者是没用到过。一般在游戏后台开发应该会经常用到吧!当然这只是
笔者的推断。先看下类图
大话设计模式-类图
再继续看下Demo吧
/*** 需要保存的进度信息类*/
public classRoleSateMemento{privateInteger atk;privateInteger vit;privateInteger attack;publicRoleSateMemento(Integer atk, Integer vit, Integer attack) {super();this.atk =atk;this.vit =vit;this.attack =attack;
}publicInteger getAtk() {returnatk;
}public voidsetAtk(Integer atk) {this.atk =atk;
}publicInteger getVit() {returnvit;
}public voidsetVit(Integer vit) {this.vit =vit;
}publicInteger getAttack() {returnattack;
}public voidsetAttack(Integer attack) {this.attack =attack;
}
}
/*** 存储进度类*/
public classRolerStateCaretaker {privateRoleSateMemento roleSateMemento;publicRoleSateMemento getRoleSateMemento() {returnroleSateMemento;
}public voidsetRoleSateMemento(RoleSateMemento roleSateMemento) {this.roleSateMemento =roleSateMemento;
}
}
/*** 角色类*/
public classRolerInfo {privateInteger atk;privateInteger vit;privateInteger attack;publicRolerInfo(Integer atk, Integer vit, Integer attack) {super();this.atk =atk;this.vit =vit;this.attack =attack;
}public staticRolerInfo initRoler() {return new RolerInfo(100, 100, 100);
}public voidshowState() {
System.out.println("当前血量: " +vit);
System.out.println("当前攻击力: " +atk);
System.out.println("当前防御力: " +attack);
}publicRoleSateMemento saveRolerInfo() {return newRoleSateMemento(atk, vit, attack);
}public voidrestoreMenmento(RoleSateMemento roleSateMemento) {this.vit =roleSateMemento.getVit();this.atk =roleSateMemento.getAtk();this.attack =roleSateMemento.getAttack();
}publicInteger getAtk() {returnatk;
}public voidsetAtk(Integer atk) {this.atk =atk;
}publicInteger getVit() {returnvit;
}public voidsetVit(Integer vit) {this.vit =vit;
}publicInteger getAttack() {returnattack;
}public voidsetAttack(Integer attack) {this.attack =attack;
}
}
/*** 客户端*/
public classTest {public static voidmain(String[] args) {
RolerInfo role=RolerInfo.initRoler();
System.out.println("----------大战BOSS之前----------");
role.showState();//保持进度
RolerStateCaretaker caretaker = newRolerStateCaretaker();
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之后就变性,所以性别并不需要保存,所以这里没有用继承,记忆只是负责保存需要保存的属性。
以上是笔者对备忘录模式的理解,希望能帮助学习的小伙伴。另外笔者强烈推荐学习的小伙伴多看看大话设计模式,然后领悟其精髓,自己在手动写一次代码。