设计模式—行为型模式之备忘录模式

设计模式---行为型模式之备忘录模式

备忘录(Memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。这是一种对象行为型模式。

有如下角色:

  • 发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

  • 备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

  • 管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

示例

比如我们有一个奥特曼游戏,每一个奥特曼有血量,等级,我们可以建一个游戏备份来保存这些有用的内容,并使用游戏服务器管理他们。

奥特曼类如下:

java 复制代码
@Data
public class Ultraman {
    private Integer hp;//血量
    private Integer level;//等级

    //备忘录管理者
    private GameServer gameServer = new GameServer();

    /**
     * 进行游戏
     */
    public void play(){
        hp = level = new Random().nextInt();
    }

    /**
     * 保存备忘录
     */
    public void saveRocord() throws Exception {
        System.out.println("保存备忘录");
        gameServer.addRecord(this);
    }

    /**
     * 获取备忘录
     */
    public Ultraman restoreRecord(Integer id) throws Exception {
        System.out.println("获取记录");
        return gameServer.getRecord(id);
    }

    public void exit() throws Exception {
        System.out.println("退出并存档");
        gameServer.addRecord(this);
    }
}

记录类如下:

java 复制代码
/**
 * 游戏备份----备忘录
 */
@Data
public class GameRocord {
    private Integer id;//备忘录id
    private Integer hp;//血量
    private Integer level;//等级
}

游戏服务器类如下:

java 复制代码
/**
 * 游戏服务器------备忘录管理者
 */
public class GameServer {
    //记录id
    private Integer i = 1;
    //备忘录管理
    private Map<Integer,GameRocord> recordMap = new HashMap<>();

    /**
     * 添加备忘录
     */
    public void addRecord(Ultraman ultraman) throws Exception {
        GameRocord gameRocord = new GameRocord();
        BeanUtils.copyProperties(gameRocord,ultraman);
        gameRocord.setId(i++);
        recordMap.put(gameRocord.getId(),gameRocord);
    }

    /**
     * 恢复备忘录
     */
    public Ultraman getRecord(Integer id) throws Exception{
        GameRocord gameRocord = recordMap.get(id);
        Ultraman ultraman = new Ultraman();
        BeanUtils.copyProperties(ultraman,gameRocord);
        return ultraman;
    }

}

测试类如下:

java 复制代码
public class MementoTest {
    public static void main(String[] args) throws Exception {
        Ultraman ultraman = new Ultraman();
        //进行游戏
        ultraman.play();
        //存档
        ultraman.saveRocord();
        ultraman.setHp(1);
        ultraman.saveRocord();
        Ultraman ultramanRecord = ultraman.restoreRecord(1);
        ultraman.exit();
    }
}

运行截图如下:

相关推荐
明洞日记2 小时前
【设计模式手册014】解释器模式 - 语言解释的优雅实现
java·设计模式·解释器模式
ZHE|张恒2 小时前
设计模式(十六)迭代器模式 — 统一访问集合元素的方式,不暴露内部结构
设计模式·迭代器模式
未秃头的程序猿6 小时前
🚀 设计模式在复杂支付系统中的应用:策略+工厂+模板方法模式实战
后端·设计模式
雨中飘荡的记忆6 小时前
深入理解设计模式之单例模式
java·设计模式
8***29318 小时前
能懂!基于Springboot的用户增删查改(三层设计模式)
spring boot·后端·设计模式
在未来等你17 小时前
AI Agent设计模式 Day 19:Feedback-Loop模式:反馈循环与自我优化
设计模式·llm·react·ai agent·plan-and-execute
兵bing1 天前
设计模式-访问者模式
设计模式·访问者模式
python零基础入门小白1 天前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习
MC丶科1 天前
Java设计模式漫画英雄宇宙-工厂模式 —Factory博士的“超级英雄制造机”!
java·设计模式·漫画
明洞日记1 天前
【设计模式手册013】命令模式 - 请求封装的优雅之道
java·设计模式·命令模式