4 行为型模式之 - 备忘录模式
九路 170 6

备忘录模式介绍:

备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,这有点像我们平时说的“后悔”药。备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外界访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露

备忘录模式的定义:

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

对于备忘录模式来说,比较贴切的场景应该是游戏中的存档功能,该功能就是将游戏进度存储到本地文件系统或者数据库中,下次再进入游戏时,加载进度,使得玩家能够继续上一次的游戏之旅,这里我们就以“使命召唤”这款游戏为例子这说明备忘录模式的实现

/**
 *
 * 备忘录,只是用来存储游戏过程中的数据
 */
public class Memoto {
    public int mCheckPoint; //游戏的关卡数
    public int mLifeValue;  //游戏的血量


    @Override
    public String toString() {
        return "mCheckPoint="+mCheckPoint+" mLifeValue="+mLifeValue;
    }
}
/**
 * 管理备忘录的,有可能很很多个备忘录,该例子中只有一个
 */
public class Caretaker {
    private Memoto memoto;


    public void saveMemoto(Memoto memoto){
        this.memoto = memoto;
    }

    public Memoto getMemoto(){
        return memoto;
    }

}

下面是“使命召唤”游戏

/**
 * 使命召唤游戏
 * 该功能就是将在游戏进度存储到文件系统或者数据库中,下次再进入时从本地加载进度
 * 使得玩家能够继续上一次的游戏之旅。下面是用代码演示备忘录在此种场景中的应用
 */
public class CallOfDuty {
    private int mLifeValue = 100;
    private int mCheckPoint = 1;

    //玩游戏
    public void play() {
        System.out.println("玩游戏:第" + mCheckPoint + "关,奋战杀敌中");
        mLifeValue -= 30;
        mCheckPoint++;
        System.out.println("到达第" + mCheckPoint + "关");
    }

    //退出游戏
    public void quit() {
        System.out.println("======== 退出游戏前的状态 =========");
        System.out.println("mCheckPoint=" + mCheckPoint+" mLifeValue=" + mLifeValue );
    }

    //创建备忘录
    public Memoto createMemoto() {
        Memoto memoto = new Memoto();
        memoto.mLifeValue = mLifeValue;
        memoto.mCheckPoint = mCheckPoint;

        return memoto;
    }

    //恢复游戏
    public void restore(Memoto memoto) {
        this.mLifeValue = memoto.mLifeValue;
        this.mCheckPoint = memoto.mCheckPoint;

        System.out.println("======== 恢复游戏后的状态 =========");
        System.out.println(memoto);
    }


}

测试类:

/**
 * 测试备忘录模式
 */
public class MemotoTest {

    public static void main(String[] args){
        // 创建游戏
        CallOfDuty game = new CallOfDuty();

        // 1 打游戏
        game.play();

        // 2 游戏存档
        Caretaker caretaker = new Caretaker();
        caretaker.saveMemoto(game.createMemoto());

        // 3 退出游戏
        game.quit();

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


}

通过上面的例子,应该能明白备忘录模式的用法

预览图
评论区

索引目录