白话-23种设计模式13-备忘录模式

举报
object 发表于 2022/07/08 16:27:11 2022/07/08
【摘要】 一、白话  玩游戏的时候,我们经常会存储进度,或者玩到某个进度的时候,系统自动保存,当我们死亡时,能够直接读取保存的某个状态,让我们重新攻略一次。存储某个时间节点的状态,便于后续恢复,就是备忘录模式。二、定义  在不破坏封装性的前提下,捕获某个状态的内部状态,并在该对象之外保存这个状态。备忘录模式的主要角色如下。发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和...

一、白话

  玩游戏的时候,我们经常会存储进度,或者玩到某个进度的时候,系统自动保存,当我们死亡时,能够直接读取保存的某个状态,让我们重新攻略一次。存储某个时间节点的状态,便于后续恢复,就是备忘录模式。

二、定义

  在不破坏封装性的前提下,捕获某个状态的内部状态,并在该对象之外保存这个状态。

备忘录模式的主要角色如下。
发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

三、示例

/**
 * 备忘录角色-需要存储的内部状态角色,备忘单位
 */
public class Hero {
    // 名字
    private String name;
    // 血量
    private int blood;

    public Hero(String name, int blood) {
        this.name = name;
        this.blood = blood;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getBlood() {
        return blood;
    }

    public void setBlood(int blood) {
        this.blood = blood;
    }
}
// 发起者角色-提供创建和恢复备忘录功能,同时记录当前状态
public class Player {
    private String name;
    private int blood;

    // 创建备忘
    public Hero creatMemento() {
        return new Hero(name, blood);
    }

    // 恢复至备忘
    public void backMemento(Hero hero) {
        this.name = hero.getName();
        this.blood = hero.getBlood();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getBlood() {
        return blood;
    }

    public void setBlood(int blood) {
        this.blood = blood;
    }
}
/**
 * 管理者角色-对备忘录进行管理,提供保存和获取备忘录,但不能操作,只能交给发起人
 */
public class Game {
    private Map<String,Hero> mementos = new HashMap<>();

    // 读取指定备份
    public Hero readMemento(String node) {
        if(!mementos.containsKey(node)) {
            throw new IllegalArgumentException("备份不存在");
        }
        return mementos.get(node);
    }

    // 存储备份
    public void saveMemento(String node, Hero hero) {
        mementos.put(node, hero);
    }
}
public class MementoApplication {
    // 客户端调用
    public static void main(String[] args) {
        // 模拟玩游戏-新建一个发起人,即当前游戏状态
        Player player = new Player();
        // 当前游戏角色状态 李白 90滴血
        player.setName("李白");
        player.setBlood(90);
        // 发起人保存状态,管理者进行管理
        Game game = new Game();
        game.saveMemento("第一关", player.creatMemento());
        System.out.println("第一关存储完成,角色:" +player.getName()+ ",血量:" + player.getBlood());
        // 第二关 角色以及状态
        player.setName("王昭君");
        player.setBlood(100);
        game.saveMemento("第二关", player.creatMemento());
        System.out.println("第二关存储完成,角色:" +player.getName()+ ",血量:" + player.getBlood());
        // 第三关 想重玩第一关  第三关当前角色 蔡文姬 80
        player.setName("蔡文姬");
        player.setBlood(80);
        // 读取第一关节点
        System.out.println("第一关读取中,读取前角色:" +player.getName()+ ",血量:" + player.getBlood());
        player.backMemento(game.readMemento("第一关"));
        System.out.println("第一关读取完成,当前角色:" + player.getName()+ ",血量:" + player.getBlood());
    }
}

结果输出:

第一关存储完成,角色:李白,血量:90
第二关存储完成,角色:王昭君,血量:100
第一关读取中,读取前角色:蔡文姬,血量:80
第一关读取完成,当前角色:李白,血量:90

  

四、总结

  特点:提供状态恢复,可以撤销。如果保存的对象数据越大,需要保存的节点越多,则资源消耗就越大。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。