架构师之路--备忘录模式

目录

介绍

定义

使用场景

代码实现


介绍

     备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,它的实现方式需要保证被保存的对象状态不能被从外部访问,目的是为了保护好被保存的对象状态的完整性以及内部实现不向外暴露。

定义

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

使用场景

     1、需要保存一个对象在某一时刻的状态或者部分状态;

     2、如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望对外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。

代码实现

     这里以玩游戏为例来说明备忘录模式的实现,我们在玩游戏时,经常会中断退出,退出前需要保存一下当前状态,下次进来时恢复到上一次退出时的状态,游戏类的伪代码如下:

public class CallOfDuty {
    private int mCheckpoint = 1;
    private int mLifeValue = 100;
    private String mWeapon = "沙漠之鹰";

    // 打游戏
    public void play() {
        System.out.println("打游戏 : " + String.format("第%d关", mCheckpoint) + " 奋战杀敌中");
        mLifeValue -= 10;
        System.out.println("进度升级啦");
        mCheckpoint++;
        System.out.println("到达 " + String.format("第%d关", mCheckpoint));
    }

    public void quit() {
        System.out.println("-------------");
        System.out.println("退出前的游戏属性 : " + this.toString());
        System.out.println("退出游戏");
        System.out.println("-------------");
    }

    /**
     * 创建备忘录
     * 
     * @return
     */
    public Memoto createMemoto() {
        Memoto memoto = new Memoto();
        memoto.mCheckpoint = mCheckpoint;
        memoto.mLifeValue = mLifeValue;
        memoto.mWeapon = mWeapon;
        return memoto;
    }

    public void restore(Memoto memoto) {
        this.mCheckpoint = memoto.mCheckpoint;
        this.mLifeValue = memoto.mLifeValue;
        this.mWeapon = memoto.mWeapon;
        System.out.println("恢复后的游戏属性 : " + this.toString());
    }

    public void setCheckPoint(int point) {
        mCheckpoint = point;
    }

    public int getCheckpoint() {
        return mCheckpoint;
    }

    public void setLifeValue(int mLifeValue) {
        this.mLifeValue = mLifeValue;
    }

    public int getLifeValue() {
        return mLifeValue;
    }

    public String getWeapon() {
        return mWeapon;
    }

    public void setWeapon(String weapon) {
        this.mWeapon = weapon;
    }

    @Override
    public String toString() {
        return "CallOfDuty [mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue
                + ", mWeapon=" + mWeapon + "]";
    }
}

     我们可以调用createMemoto接口创建备忘录,restore接口恢复备忘录,这样游戏中的其他状态就可以不对外暴露了。备忘录的伪代码如下:

public class Memoto {
    public int mCheckpoint;
    public int mLifeValue;
    public String mWeapon;

    @Override
    public String toString() {
        return "Memoto [mCheckpoint=" + mCheckpoint + ", mLifeValue=" + mLifeValue + ", mWeapon="
                + mWeapon + "]";
    }

}

     我们还可以创建Caretaker类来管理备忘录,源码如下:

public class Caretaker {
    Memoto mMemoto;

    /**
     * 存档
     */
    public void archive(Memoto memoto) {
        this.mMemoto = memoto;
    }

    /**
     * 获取存档
     */
    public Memoto getMemoto() {
        return mMemoto;
    }

}

     调用过程如下:

public class Client {
    public static void main(String[] args) {
        CallOfDuty game = new CallOfDuty();
        game.play();

        Caretaker caretaker = new Caretaker();
        // 游戏存档
        caretaker.archive(game.createMemoto());
        // 退出游戏
        game.quit();

        // 恢复游戏
        CallOfDuty newGame = new CallOfDuty();
        newGame.restore(caretaker.getMemoto());
    }
}

     这样就很好的模拟了我们游戏存档、恢复游戏的过程,是不是很简单??呵呵,还是要说明一下,我们的伪代码都非常的简单,这不是重点,我们的重点是要学会这些思想,这才是精华,把所有的这些设计模式熟练的运用到我们的实际工作中,那才是最最重点的!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红-旺永福

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值