.NET 设计模式—备忘录模式(Memento Pattern)

embedded/2024/9/23 10:39:27/

简介

        备忘录模式,又称之为快照模式(Snapshop Pattern),是一种行为型设计模式,,它允许在不破坏对象封装性的前提下,捕获并保存一个对象的内部状态,以便在需要时恢复该对象到原先的状态。备忘录模式可以为我们提供一种“后悔药”的机制,它通过存储系统中各个历史状态的快照,使得我们可以在任一时刻将系统回滚到历史状态。

角色

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

优点

  • 可以随时保存一个对象的状态,并在需要时恢复到该状态,提高了程序的灵活性和可维护性;
  • 发起人和备忘录之间的封装使得客户端无法直接访问备忘录,从而更好地保护了对象的状态信息;
  • 管理者可以管理多个备忘录,提供了更好的历史记录和回滚功能。

缺点

  • 备忘录模式的缺点包括:如果备忘录对象过多或者状态信息过于复杂,会占用较多的内存空间;
  • 捕获和恢复一个对象的状态需要时间和资源,可能会影响程序的性能;

应用场景

  • 保存和恢复对象状态:在软件中,有些对象的状态需要在不同时间点进行保存和恢复。备忘录模式可以捕获对象的状态,并在需要时恢复对象到先前的状态。例如,在浏览器中的后退功能,或者在编辑工具中的撤销操作等。
  • 实现可回滚的撤销操作:在软件中,撤销操作是一个常见的功能。备忘录模式可以保存对象的状态,以便在撤销操作时恢复对象到先前的状态。例如,在Word中编写文档,如果想要撤销之前的输入/删除操作,可以使用备忘录模式实现可回滚的撤销操作。

实现

  • 定义发起人(Originator)
public class Originator
{// 发起人的内部状态信息private string state;public string State{get { return state; }set { state = value; }}// 保存状态到备忘录的方法public Memento SaveToMemento(){// 这里可以根据需要序列化状态信息到备忘录对象中return new Memento(state); // 假设Memento类有一个构造函数接收状态信息}// 从备忘录中恢复状态的方法public void RestoreFromMemento(Memento memento){// 这里可以根据备忘录中的信息反序列化状态到发起人对象中State = memento.GetState(); // 假设Memento类有一个GetState方法返回状态信息}
}
  • 定义备忘录(Memento)
public class Memento
{private string state; // 存储状态信息的字段,可以是任何类型,视具体情况而定。public Memento(string state) // 构造函数接收状态信息{this.state = state;}public string GetState() // 提供获取状态信息的方法{return state;}
}
  • 定义管理者(Caretaker)
public class Caretaker
{private Memento memento; // 存储备忘录的字段。// 保存备忘录的方法,由外部调用以保存发起人的状态。public void Save(Originator originator){memento = originator.SaveToMemento(); // 保存发起人的当前状态到备忘录中。}// 恢复备忘录的方法,由外部调用以恢复发起人的状态。public void Restore(Originator originator){originator.RestoreFromMemento(memento); // 使用保存的备忘录恢复发起人的状态。}
}
  • 上层应用调用
Originator originator = new Originator(); // 创建发起人对象。
Caretaker caretaker = new Caretaker(); // 创建管理者对象。
originator.State = "初始状态"; // 设置发起人的初始状态。
caretaker.Save(originator); // 保存当前状态到备忘录。
// ... 可能进行一些操作改变originator的状态 ...
originator.State = "改变后的状态"; // 发起人状态改变。
caretaker.Restore(originator); // 通过备忘录恢复至之前保存的状态。

在这个案例中,Originator 类负责维护其内部状态,Memento 类存储这些状态信息,而 Caretaker 类负责在需要时保存和恢复这些状态。这种方式允许在不破坏封装性的前提下管理对象的历史状态。


http://www.ppmy.cn/embedded/6675.html

相关文章

头歌平台云计算实验

云计算 Hive综合应用案例——用户学历查询1 查询每一个用户从出生到现在的总天数2 同一个地区相同的教育程度的最高收入3 统计各级学历所占总人数百分比 Hive综合应用案例——用户学历查询 1 查询每一个用户从出生到现在的总天数 ---------- 禁止修改 ----------drop databas…

SpringCloud系列(8)--将服务提供者Provider注册进Eureka Server

前言:上一章节我们介绍了Eureka服务端的安装与配置,本章节则介绍关于微服务如何入职Eureka Server Eureka架构原理图 1、修改provider-payment8001子模块的pom.xml文件,引入Eureka Clinet的依赖,然后reolad一下,下载依…

centos的服务器root密码重置的步骤

如果CentOS服务器的root密码被修改了,你需要进行密码恢复操作。以下是在CentOS系统上恢复或重置root密码的步骤: CentOS 7 或 CentOS 8 重启服务器: 重新启动你的服务器。在启动过程中,当GRUB启动菜单出现时,按下e键来…

Python数据挖掘项目开发实战:使用朴素贝叶斯进行社会媒体挖掘

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python数据挖掘项目开发实战_使用朴素贝叶斯进行社会媒体挖掘_编程案例实例课程教程.pdf Pytho…

2024红明谷杯——Misc 加密的流量

2024红明谷杯——Misc 加密的流量 写在前面: 这里是贝塔贝塔,照例来一段闲聊 打比赛但赛前一波三折,又是成功签到的一个比赛 说起来比赛全名叫红明谷卫星应用数据安全场景赛,但好像真的跟卫星的关系不大,没有bin方…

Java高阶私房菜:高并发之线程池底层原理学习

目录 什么是池化思想 什么是线程池 JDK中线程池关键类( ThreadPoolExecutor) 线程池设计原理和核心参数配置 ​编辑线程拒绝策略 Executors创建常见线程池种类 工具类创建线程池 应用场景问题解析 商品详情页聚合接口 商家管理后台业务报表数据…

C++奇迹之旅:构造函数和析构函数

文章目录 📝类的6个默认成员函数🌠 构造函数🌉 概念🌉特性🌉三种默认构造函数 🌠 析构函数🌠 特性🚩总结 📝类的6个默认成员函数 如果一个类中什么成员都没有&#xff0…

SpringBoot 监控 SQL 运行情况(实战教程)

1 基本概念 2 添加依赖 3 配置相关属性 4 sql监控 5 慢sql记录 6 spring 监控 7 去 Ad(广告) 8 获取 Druid 的监控数据 1 基本概念 Druid是Java语言中最好的数据库连接池。 虽然HikariCP的速度稍快,但是,Druid能够提供强…