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

news/2024/9/25 23:24:36/

简介

        备忘录模式,又称之为快照模式(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/news/1427309.html

相关文章

数据库-Redis(14)

目录 66.Redis为什么主从全量复制使用RDB而不是使用AOF? 67.Redis为什么还有无磁盘复制模式? 68.Redis为什么还会有从库的从库设计?

ChatGPT研究论文提示词集合1-【主题选择与问题研究、文献综述】

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.主题选择与问题定义 2.文献综述 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程,精心准备一套学术研究各个流程的提示词集合。总共14个步骤…

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

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

(2022级)成都工业学院数据库原理及应用实验六: SQL DML(增、删、改)

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求,请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询: 1、在科室表…

Linux使用Docker部署Firefox火狐浏览器并实现无公网IP远程访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

Redis慢查询问题的排查和解决

1.排查慢查询问题 (1)设置慢查询参数 slowlog-log-slower-than 10000 --设置慢查询的时间阀值,单位微秒 slowlog-max-len 128 --设置慢查询FIFO队列的长度 (2)模拟大KEY public class RedisExa…

网站空间的类型包括

网站空间的类型包括许多不同的形式,每种形式都具有其独特的特点和用途。从个人博客到企业网站,从电子商务平台到社交网络,各种类型的网站都为用户提供了不同的体验和功能。在本文中,我们将探讨几种常见的网站空间类型,…

【java】26:JUnit

为什么需要 JUnit: 1.一个类有很多功能代码需要测试,为了测试,就需要写入到main方法中 2.如果有多个功能代码测试,就需要来回注销,切换很麻烦……… 3.如果可以直接运行一个方法,就方便很多,并且…