《大话设计模式》java实现之备忘录模式

备忘录模式主要用于记录历史操作以及操作撤回等。重写例子时对书中做了一些更改,例如
RoleStateCaretaker里存放的Memento改成了List,这样可以模拟多次撤回的操作,比如word文档就可以撤回多次,如果只有一个Memento,只能回滚一次。
UML图
这里写图片描述
代码结构
这里写图片描述

public class Client {
    public static void main(String[] args) {
        //大战boss前
        GameRole lixiaoyao = new GameRole(100, 100, 100);
        lixiaoyao.stateDisplay();

        //保存进度
        RoleStateCaretaker stateAdmin = new RoleStateCaretaker();
        stateAdmin.getMementos().add(lixiaoyao.saveState());

        //大战boss
        lixiaoyao.fight();
        lixiaoyao.stateDisplay();
        stateAdmin.getMementos().add(lixiaoyao.saveState());   

        //大战boss
        lixiaoyao.fight();
        lixiaoyao.stateDisplay();
        stateAdmin.getMementos().add(lixiaoyao.saveState());   

        lixiaoyao.recoverState(stateAdmin.getMementos().get(1)); //回滚到第一次战斗后的状态
        lixiaoyao.stateDisplay();

    }
}
public class GameRole {
    private int vit;
    private int atk;
    private int def;

    public GameRole(int vit, int atk, int def) {
        this.vit = vit;
        this.atk = atk;
        this.def = def;
    }

    public int getvit() {
        return vit;
    }

    public void setvit(int vit) {
        this.vit = vit;
    }

    public int getAtk() {
        return atk;
    }

    public void setAtk(int atk) {
        this.atk = atk;
    }
    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }

    //保存角色状态
    public RoleStateMemento saveState() {
        return new RoleStateMemento(vit, atk, def);
    }

    //恢复角色状态
    public void recoverState(RoleStateMemento memento) {
        this.vit = memento.getvit();
        this.atk = memento.getAtk();
        this.def = memento.getDef();
    }

    public void stateDisplay() {
        System.out.println("角色当前状态:");
        System.out.println("体力" + this.vit);
        System.out.println("攻击力" + this.atk);
        System.out.println("防御力" + this.def);
        System.out.println("-----------------------");
    }

    public void fight() {
        this.vit -= 10;
        this.atk -= 10;
        this.def -= 10;
    }
}
public class RoleStateCaretaker {
    List<RoleStateMemento> mementos = new ArrayList<>();

    public List<RoleStateMemento> getMementos() {
        return mementos;
    }

    public void setMementos(List<RoleStateMemento> mementos) {
        this.mementos = mementos;
    }
}
public class RoleStateMemento {
    private int vit;
    private int atk;
    private int def;

    public RoleStateMemento(int vit, int atk, int def) {
        super();
        this.vit = vit;
        this.atk = atk;
        this.def = def;
    }

    public int getvit() {
        return vit;
    }

    public void setvit(int vit) {
        this.vit = vit;
    }

    public int getAtk() {
        return atk;
    }

    public void setAtk(int atk) {
        this.atk = atk;
    }
    public int getDef() {
        return def;
    }

    public void setDef(int def) {
        this.def = def;
    }

}

运行结果
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值