【设计模式】十九.行为型模式之备忘录模式

备忘录模式

一. 说明

备忘录模式是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,方便后续将该对象恢复到原先保存的状态,它是行为型模式的一种。

备忘录模式多用于客户端程序,服务端开发不常见,像我们打游戏时记录存档,打boss败了可以从存档处恢复重新打;csdn文档编辑时的撤销等等这些都是备忘录模式的思想。

二.应用场景

  1. 游戏的存档恢复功能
  2. 文档编辑器里的撤销回滚操作
  3. 事务管理中的回滚事务操作
  4. 配置中心的应用配置文件的版本记录和回滚功能

三.代码示例

备忘录模式在服务端开发中一般不太使用,在这里我们用一个简单的打游戏存档的例子表述这个模式。

我们先创建一个游戏玩家类

@Data
public class GamePlayer {
    //生命值
    private int vitality;
    //攻击力
    private int attack;
    //防御力
    private int defense;

    public GamePlayer() {
        init();
    }

    //状态显示
    public void displayState(){
        System.out.println("---------------------");
        System.out.println("当前玩家状态:");
        System.out.println("生命值:" + vitality);
        System.out.println("攻击力:" + attack);
        System.out.println("防御力:" + defense);
        System.out.println("---------------------");
    }

    //原始状态
    private void init(){
        this.vitality = 100;
        this.attack = 100;
        this.defense = 100;
    }

    //与boss战斗后的状态
    public void fight(){
        System.out.println("与boss对战");
        this.vitality = 0;
        this.attack = 0;
        this.defense = 0;
    }
}

先简单测试一下

public static void main(String[] args) {
        GamePlayer player = new GamePlayer();
        player.displayState();
        player.fight();
        player.displayState();
    }

在这里插入图片描述
现在加入备忘录,在打boss前保存玩家状态到备忘录,打boss失败后恢复备忘录

创建备忘录记录玩家状态值

@Data
public class PlayerStateMemento {
    //生命值
    private int vitality;
    //攻击力
    private int attack;
    //防御力
    private int defense;

    public PlayerStateMemento(int vitality, int attack, int defense) {
        this.vitality = vitality;
        this.attack = attack;
        this.defense = defense;
    }
}

给GamePlayer加入保存进度和恢复进度的方法

@Data
public class GamePlayer {
    //生命值
    private int vitality;
    //攻击力
    private int attack;
    //防御力
    private int defense;

    public GamePlayer() {
        init();
    }

    //状态显示
    public void displayState(){
        System.out.println("---------------------");
        System.out.println("当前玩家状态:");
        System.out.println("生命值:" + vitality);
        System.out.println("攻击力:" + attack);
        System.out.println("防御力:" + defense);
        System.out.println("---------------------");
    }

    //原始状态
    private void init(){
        this.vitality = 100;
        this.attack = 100;
        this.defense = 100;
    }

    //与boss战斗后的状态
    public void fight(){
        System.out.println("与boss对战");
        this.vitality = 0;
        this.attack = 0;
        this.defense = 0;
    }

    //保存游戏状态
    public PlayerStateMemento saveState(){
        System.out.println("保存游戏进度");
        return new PlayerStateMemento(this.vitality, this.attack, this.defense);
    }

    //恢复角色状态
    public void recoveryState(PlayerStateMemento memento){
        System.out.println("恢复游戏进度");
        this.vitality = memento.getVitality();
        this.attack = memento.getAttack();
        this.defense = memento.getDefense();
    }
}

新增一个控制备忘录的管理者,用来临时记录备忘录

@Data
public class PlayerStateCaretaker {
    private PlayerStateMemento memento;
}

编写测试代码

public static void main(String[] args) {
        GamePlayer player = new GamePlayer();
        player.displayState();
        //保存游戏进度
        PlayerStateCaretaker caretaker = new PlayerStateCaretaker();
        caretaker.setMemento(player.saveState());
        //大战boss
        player.fight();
        player.displayState();
        //失败后游戏进度恢复
        player.recoveryState(caretaker.getMemento());
        player.displayState();
    }

在这里插入图片描述

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值