前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之备忘录模式

设计模式之备忘录模式

作者头像
九转成圣
发布2024-04-10 16:36:08
680
发布2024-04-10 16:36:08
举报
文章被收录于专栏:csdncsdn

备忘录模式(Memento)

定义

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

使用场景

主要角色

  1. 发起人 Originator 需要备份的对象
  2. 看管人 Caretaker 保存备份的容器
  3. 备忘录 Memento 备份对象

类图

示例代码

需要备份的对象

代码语言:javascript
复制
public class Originator {
    private String state1;
    private String state2;
    private String staten;

    void setState1(String state1) {
        this.state1 = state1;
    }

    String getState1() {
        return state1;
    }

    // 创建备忘录
    Memento createMemento() {
        Memento memento = new Memento();
        memento.setState1(state1);
        memento.setStaten(staten);
        return memento;
    }

    // 恢复状态
    void restoreMemento(Memento memento) {
        this.state1 = memento.getState1();
        this.staten = memento.getStaten();
    }
}

备份对象

代码语言:javascript
复制
@Data
public class Memento {
    private String state1;
    private String staten;
}

看管人:负责管理备份

代码语言:javascript
复制
public class Caretaker {
    private final Map<String,Memento> history = new HashMap<>();

    // 保存备忘录
    public void saveMemento(String name,Memento memento) {
        history.put(name,memento);
    }

    // 获取备忘录
    public Memento getMemento(String name) {
        return history.get(name);
    }
    public Memento removeMemento(String name) {
        return history.remove(name);
    }
}
代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        // 创建发起人
        Originator originator = new Originator();

        // 创建负责人
        Caretaker caretaker = new Caretaker();

        // 设置发起人的状态
        originator.setState1("State 1");
        System.out.println("Current State: " + originator.getState1());

        // 保存状态
        caretaker.saveMemento("第一次备份", originator.createMemento());

        // 修改发起人的状态
        originator.setState1("State 2");
        System.out.println("Updated State: " + originator.getState1());

        // 恢复状态
        originator.restoreMemento(caretaker.getMemento("第一次备份"));
        System.out.println("Restored State: " + originator.getState1());
    }
}
代码语言:javascript
复制
Current State: State 1
Updated State: State 2
Restored State: State 1

备忘录模式与命令模式对比

  1. 两者都能实现回退与撤销操作
  2. 命令模式是通过反向命令实现的,只能逐步回退或撤销,备忘录模式生产生产当前对象的快照,可以恢复到任意备份点

工作中遇到场景

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 备忘录模式(Memento)
  • 定义
  • 使用场景
  • 主要角色
  • 类图
  • 示例代码
  • 备忘录模式与命令模式对比
  • 工作中遇到场景
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com