备忘录模式(java实现)

备忘录模式

 

public class GameRole {

//生命力

private int vitality;

//攻击力

private int attack;

//防御力

private int defense;

public int getVitality() {

return vitality;

}

public void setVitality(int vitality) {

this.vitality = vitality;

}

public int getAttack() {

return attack;

}

public void setAttack(int attack) {

this.attack = attack;

}

public int getDefense() {

return defense;

}

public void setDefense(int defense) {

this.defense = defense;

}

//状态显示

public void stateShow() {

System.out.println("当前角色状态为:");

System.out.println("体力:"+this.vitality);

System.out.println("攻击力:"+this.attack);

System.out.println("防御力:"+this.defense);

}

//获得初始状态

public void getInitState() {

this.vitality=100;

this.attack=100;

this.defense=100;

}

//战斗

public void fight() {

this.vitality=0;

this.attack=0;

this.defense=0;

}

public static void main(String[] args) {

GameRole role=new GameRole();

//大战boss前,获得角色初始状态

role.getInitState();

role.stateShow();

//通过构造一个新的对象来保存游戏进度

GameRole save=new GameRole();

save.vitality= role.vitality;

save.attack=role.attack;

save.defense=role.defense;

//大战boss,数据损耗为0

role.fight();

role.stateShow();

//恢复之前的状态

role.vitality=save.vitality;

role.attack=save.attack;

role.defense=save.defense;

role.stateShow();

}

}

这样写,客户端的职责太大,需要知道游戏的生命力,攻击力和防御力这些细节,还要对它进行备份和恢复,我们希望把这些游戏的存取状态细节封装起来,而且最好是封装在外部的类中,以体现职责分离.

备忘录模式:

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

public class GameRole {

//生命力

private int vitality;

//攻击力

private int attack;

//防御力

private int defense;

public int getVitality() {

return vitality;

}

public void setVitality(int vitality) {

this.vitality = vitality;

}

public int getAttack() {

return attack;

}

public void setAttack(int attack) {

this.attack = attack;

}

public int getDefense() {

return defense;

}

public void setDefense(int defense) {

this.defense = defense;

}

//状态显示

public void stateShow() {

System.out.println("当前角色状态为:");

System.out.println("体力:"+this.vitality);

System.out.println("攻击力:"+this.attack);

System.out.println("防御力:"+this.defense);

}

//获得初始状态

public void getInitState() {

this.vitality=100;

this.attack=100;

this.defense=100;

}

//战斗

public void fight() {

this.vitality=0;

this.attack=0;

this.defense=0;

}

public RoleStateMemento saveState() {

return new RoleStateMemento(vitality,attack,defense);

}

public void recoverState(RoleStateMemento memento) {

this.vitality=memento.getVitality();

this.attack=memento.getAttack();

this.defense=memento.getDefense();

}

}

//角色状态存储箱

public class RoleStateMemento {

private int vitality;

private int attack;

private int defense;

public RoleStateMemento(int vitality, int attack, int defense) {

this.vitality = vitality;

this.attack = attack;

this.defense = defense;

}

public int getVitality() {

return vitality;

}

public void setVitality(int vitality) {

this.vitality = vitality;

}

public int getAttack() {

return attack;

}

public void setAttack(int attack) {

this.attack = attack;

}

public int getDefense() {

return defense;

}

public void setDefense(int defense) {

this.defense = defense;

}

}

public class Demo {

public static void main(String[] args) {

//大战boss前

GameRole role=new GameRole();

role.getInitState();

role.stateShow();

//保存进度,由于封装在RoleStateMemento类中

//因此我们也不知道保存了哪些具体的角色数据

RoleStateCaretaker stateAdmin=new RoleStateCaretaker();

stateAdmin.memento=role.saveState();

//大战boss

role.fight();

role.stateShow();

//恢复之前的状态

role.recoverState(stateAdmin.memento);

role.stateShow();

}

}

问题描述:备忘录模式也是有缺点的,角色状态需要完整存储到角色对象中,如果状态数据很大很多,那么在资源消耗上,备忘录对象会非常耗内存.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值