小菜成长记(九)——备忘录模式

一个游戏角色攻击的小程序:

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

        // 保存进度
        GameRole backup = new GameRole();
        backup.setVit(lixiaoyao.getVit());
        backup.setAtk(lixiaoyao.getAtk());

        // 大战 Boss 是,损耗严重
        lixiaoyao.fight();
        lixiaoyao.stateDisplay();

        // 恢复之前状态
        lixiaoyao.setAtk(backup.getAtk());
        lixiaoyao.setVit(backup.getVit());

        lixiaoyao.stateDisplay();
    }
}

class GameRole {
    // 生命力
    private int vit;

    public int getVit() {
        return vit;
    }

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

    // 攻击力
    private int atk;

    public int getAtk() {
        return atk;
    }

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

    // 状态显示
    public void stateDisplay() {
        System.out.println("角色当前状态:");
        System.out.println("体力:" + getVit());
        System.out.println("攻击力:" + getAtk());
    }

    // 获得初始状态
    public void getInitState() {
        setVit(100);
        setAtk(100);
    }

    // 战斗
    public void fight() {
        setVit(0);
        setAtk(0);
    }
}

采用备忘录模式改进后:

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

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

        // 大战 Boss 是,损耗严重
        lixiaoyao.fight();
        lixiaoyao.stateDisplay();

        // 恢复之前状态
        lixiaoyao.recoveryState(stateAdmin.getMemento());
        lixiaoyao.stateDisplay();
    }
}

// 角色状态存储箱
class RoleStateMemento {
    private int vit;
    private int atk;

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

    // 生命力
    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;
    }
}

// 角色状态管理者
class RoleStateCaretaker {
    private RoleStateMemento memento;

    public RoleStateMemento getMemento() {
        return memento;
    }

    public void setMemento(RoleStateMemento memento) {
        this.memento = memento;
    }
}

class GameRole {
    // 生命力
    private int vit;

    public int getVit() {
        return vit;
    }

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

    // 攻击力
    private int atk;

    public int getAtk() {
        return atk;
    }

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

    // 状态显示
    public void stateDisplay() {
        System.out.println("角色当前状态:");
        System.out.println("体力:" + getVit());
        System.out.println("攻击力:" + getAtk());
    }

    // 获得初始状态
    public void getInitState() {
        setVit(100);
        setAtk(100);
    }

    // 战斗
    public void fight() {
        setVit(0);
        setAtk(0);
    }

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

    // 恢复角色状态
    public void recoveryState(RoleStateMemento memento) {
        setVit(memento.getVit());
        setAtk(memento.getAtk());
    }
}
备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值