java设计模式-21备忘录模式

定义

  • 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
  • 它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。
  • 实现了信息的封装,不需要关心状态的保存细节。
  • 缺点:消耗资源,如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

备忘录模式的角色

  • originator : 对象(需要保存状态的对象)
  • Memento : 备忘录对象,负责保存好记录,即Originator内部状态
  • Caretaker: 守护者对象,负责保存多个备忘录对象, 使用集合管理,提高效率
  • 说明:如果希望保存多个originator对象的不同时间的状态,也可以,只需要要 HashMap <String, 集合>

代码

  • 示例:游戏状态保存
package com.example.demo;

public class test16 {
    public static void main(String[] args) {
        Game game =new Game();
        System.out.println("游戏开始,打到了第五关");
        game.setPlayerOffSeveral(5);
        System.out.println("备份一下");
        GameMemento gameMemento = game.createGameMemento();
        Caretaker caretaker = new Caretaker();
        caretaker.saveMemento(gameMemento);
        System.out.println("备份完成");

        game.play();
        System.out.println("重新开始:"+game.getPlayerOffSeveral());
        game.restore(caretaker.retrieveMemento());
        System.out.println("恢复完成:"+game.getPlayerOffSeveral());

    }
}

class GameMemento {
    //玩家的关数
    private int playerOffSeveral;

    /**
     * 备份游戏
     *
     * @return
     */
    public GameMemento(int playerOffSeveral) {
        this.playerOffSeveral = playerOffSeveral;
    }

    public int getPlayerOffSeveral() {
        return playerOffSeveral;
    }

    public void setPlayerOffSeveral(int playerOffSeveral) {
        this.playerOffSeveral = playerOffSeveral;
    }
}

class Game {
    //玩家的关数
    private int playerOffSeveral;

    public int getPlayerOffSeveral() {
        return playerOffSeveral;
    }

    public void setPlayerOffSeveral(int playerOffSeveral) {
        this.playerOffSeveral = playerOffSeveral;
    }

    /**
     * 备份
     */
    public GameMemento createGameMemento() {
        return new GameMemento(playerOffSeveral);
    }

    /**
     * 开始游戏
     */
    public void play() {
        playerOffSeveral = 0;
    }

    /**
     * 恢复备份
     *
     * @param gameMemento
     */
    public void restore(GameMemento gameMemento) {
        playerOffSeveral = gameMemento.getPlayerOffSeveral();
    }


}
//备份信息管理类

class Caretaker {
    private GameMemento gameMemento;
    //恢复备份
    public GameMemento retrieveMemento(){
        return this.gameMemento;
    }
    //保存备份
    public void saveMemento(GameMemento gameMemento){
       this.gameMemento =gameMemento;
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员黄小青

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

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

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

打赏作者

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

抵扣说明:

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

余额充值