当前位置: 首页 > news >正文

备忘录模式:快速恢复原始数据

📝 备忘录模式:快速恢复原始数据 🚀

🧐 问题描述

在开发中,我们经常会遇到需要恢复对象状态的情况。传统的解决方案通常是为每个对象创建一个保存状态的对象,但这种方法不仅保存不方便,还会增加开销和对象的数量。此外,这种方式还会暴露对象的内部细节,导致代码的可维护性降低。

🎯 备忘录模式简介

备忘录模式 是一种行为设计模式,它允许在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。这样,我们可以在需要时方便地恢复对象的状态。

主要角色

  • Originator(发起人):需要保存状态的对象。
  • Memento(备忘录):负责保存和记录 Originator 的内部状态。
  • CareTaker(守护者):负责保存多个备忘录对象,通常使用集合进行管理。

在这里插入图片描述

💻 代码示例

1. 基本备忘录模式实现

Memento 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Memento {
    private String state;
}
Originator 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Originator {
    private String state;

    // 保存状态到备忘录
    public Memento saveStateMemento() {
        return new Memento(state);
    }

    // 从备忘录恢复状态
    public void getStateFromMemento(Memento mem) {
        state = mem.getState();
    }
}
CareTaker 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CareTaker {
    private List<Memento> mementos = new ArrayList<>();

    public void add(Memento mem) {
        mementos.add(mem);
    }

    // 获取指定索引的备忘录对象
    public Memento get(int index) {
        return mementos.get(index);
    }
}
Client 类
public class Client {
    public static void main(String[] args) {
        Originator ori = new Originator();
        CareTaker careTaker = new CareTaker();

        ori.setState("状态1");
        careTaker.add(ori.saveStateMemento());

        ori.setState("状态2");
        careTaker.add(ori.saveStateMemento());

        ori.setState("状态3");
        careTaker.add(ori.saveStateMemento());

        System.out.println("当前状态:" + ori.getState());

        // 恢复到状态1
        ori.getStateFromMemento(careTaker.get(1));
        System.out.println("当前状态:" + ori.getState());
    }
}

2. 游戏角色状态恢复示例

在这里插入图片描述

Memento 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Memento {
    private int vit; // 攻击力
    private int def; // 防御力
}
GameRole 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class GameRole {
    private int vit;
    private int def;

    // 创建备忘录
    public Memento createMemento() {
        return new Memento(vit, def);
    }

    // 从备忘录恢复状态
    public void recoverGameRoleMemento(Memento memento) {
        this.vit = memento.getVit();
        this.def = memento.getDef();
    }

    // 显示当前状态
    public void display() {
        System.out.println("当前游戏角色的属性:攻击力-" + this.vit + " 防御力-" + this.def);
    }
}
Client 类
public class Client {
    public static void main(String[] args) {
        GameRole gameRole = new GameRole(100, 100);
        System.out.println("执行之前");
        gameRole.display();

        CareTaker careTaker = new CareTaker();
        careTaker.setMemento(gameRole.createMemento());

        System.out.println("执行之后:");
        gameRole.setDef(30);
        gameRole.setVit(30);
        gameRole.display();

        System.out.println("进行恢复");
        gameRole.recoverGameRoleMemento(careTaker.getMemento());
        gameRole.display();
    }
}
CareTaker 类
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CareTaker {
    private Memento memento;

    // 如果需要保存多个状态
    // private ArrayList<Memento> mementos;

    // 如果需要保存多个游戏角色的状态
    // private HashMap<String, ArrayList<Memento>> rolesMementos;
}

运行结果

在这里插入图片描述

📌 注意事项

  • 恢复机制:备忘录模式提供了一种恢复对象状态的机制,适用于需要撤销操作或回滚的场景。
  • 封装性:备忘录模式对信息进行了封装,外部无需了解对象的内部细节。
  • 资源占用:如果类的成员变量过多,备忘录模式可能会占用较多的资源,因此在使用时需要注意。
  • 适用场景:备忘录模式适用于需要撤销操作(如 Ctrl+Z)、后悔药、数据库事务处理、浏览器后退等场景。

🎉 总结

备忘录模式是一种非常实用的设计模式,特别适合需要频繁保存和恢复对象状态的场景。通过合理使用备忘录模式,我们可以有效提升代码的可维护性和灵活性,尤其是在前端开发中,能够帮助我们快速恢复原始数据,优化用户体验。

希望这篇博客笔记对你有所帮助!🚀

相关文章:

  • CSS 媒体查询:从入门到精通,打造跨设备完美体验
  • hot100_108. 将有序数组转换为二叉搜索树
  • sqlclchery面对复杂的sql语句怎么办
  • Jenkins上无法查看已成功生成的Junit报告
  • 从人机环境系统智能角度看传统IP的全球化二次创作法则
  • 前端防重复请求终极方案:从Loading地狱到精准拦截的架构升级
  • 设计模式之装饰器设计模式/包装设计模式
  • 【HeadFirst系列之HeadFirstJava】第3天之从零开始理解Java中的主数据类型和引用
  • 在聚类算法的领域特定语言(DSL)中添加一个度量矩阵组件
  • 游戏开发 游戏项目介绍
  • 记录首次安装远古时代所需的运行环境成功npm install --save-dev node-sass
  • 百度首页上线 DeepSeek 入口,免费使用
  • C++常量成员函数定义与使用
  • 详细介绍STM32(32位单片机)外设应用
  • 【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示
  • Redisson 的 RRateLimiter 限流
  • 值和引用类型在变量赋值时的区别是什么?(C#)
  • 【计算机网络】OSI模型、TCP/IP模型、路由器、集线器、交换机
  • Git-速查
  • ‌挖数据平台对接DeepSeek推出一键云端部署功能:API接口驱动金融、汽车等行业智能化升级
  • 专业做曝光引流网站/seo3的空间构型
  • 电子商务网站软件建设的/杭州网站优化方案
  • 手机百度怎么解除禁止访问网站/东莞服务好的营销型网站建设
  • 自己怎么做网站赚钱/淘宝关键词top排行榜
  • 洋桥网站建设公司/网站权重是怎么提升的
  • wordpress的tag链接url/武汉seo关键字优化