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

news/2024/5/19 23:40:08 标签: c#, .netcore, 设计模式, 行为型模式, 备忘录模式

🚀简介

备忘录模式(Memento Pattern)是一种行为型设计模式,它保存一个对象的某个状态,以便在适当的时候恢复对象。所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样我们就可以在需要的时候将该对象恢复到原先保存的状态 。

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

🚀案例

🐤发起人(Originator)角色

首先,我们创建一个Originator类,它有一个内部状态State和一个Memento对象来保存状态。

public class Originator
{
    private string _state;

    public void Set(string state)
    {
        _state = state;
    }

    public Memento SaveToMemento()
    {
        return new Memento(_state);
    }

    public void GetFromMemento(Memento memento)
    {
        _state = memento.GetState();
    }

    public string GetState()
    {
        return _state;
    }
}

🐤备忘录(Memento)角色

然后,我们创建一个Memento类,它包含一个内部状态State

public class Memento
{
    private readonly string _state;

    public Memento(string state)
    {
        _state = state;
    }

    public string GetState()
    {
        return _state;
    }
}

🐤管理者(Caretaker)角色

接下来,我们创建一个Caretaker类,它负责保存和获取Memento对象。

public class Caretaker
{
    private readonly Stack<Memento> _mementoStack = new Stack<Memento>();

    public void Add(Memento state)
    {
        _mementoStack.Push(state);
    }

    public Memento Get()
    {
        return _mementoStack.Pop();
    }
}

🐳测试类

class MyClass
{
    public static void Main(string[] args)
    {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.Set("State #1");
        caretaker.Add(originator.SaveToMemento());

        originator.Set("State #2");
        caretaker.Add(originator.SaveToMemento());

        originator.Set("State #3");
        caretaker.Add(originator.SaveToMemento());

        originator.GetFromMemento(caretaker.Get());
        Console.WriteLine("Current State: " + originator.GetState());

        originator.GetFromMemento(caretaker.Get());
        Console.WriteLine("Current State: " + originator.GetState());
    }
}

👻运行结果!

🚀优缺点

优点:
  1. 提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。
  2. 实现了内部状态的封装。除了创建它的发起人之外,其他对象都不能够访问这些状态信息。
  3. 简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则。
缺点:
  • 资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
使用场景:
  • 需要保存与恢复数据的场景,如玩游戏时的中间结果的存档功能。
  • 需要提供一个可回滚操作的场景,如 Word、记事本、Photoshopidea等软件在编辑时按Ctrl+Z 组合键,还有数据库中事务操作。

http://www.niftyadmin.cn/n/5093027.html

相关文章

文件操作合集 - C语言

前言 由于我们每次打开程序写入的数据都是在内存中处理,关闭程序就直接没有了,下次还需要重新进行操作录入数据等,这里我们就可以使用文件来保存数据,更加持久化,下面我们基于c语言来介绍一些文件操作. 文件指针: 文件的打开和关闭 文件在读写之前应该先打开文件&#xff0c;在…

for循环遍历的`form表单组件`rules规则校验失效问题——下拉框选择之后还是报红---亲测有效

问题: 大概的效果就是这种, for循环选择之后还是还是报红 看文章之前 : 先检查 model rules pops 有没有判定好 解决: 参考了他的 for循环遍历的form表单组件rules规则校验失效问题——输入内容后依然提示必填&#xff0c;亲测有效——基础积累_a-form-model的validat…

AUTOSAR汽车电子嵌入式编程精讲300篇-基于FPGA的LIN总线控制器设计与验证

目录 LIN 总线简介 1.1.1LIN 总线的特点 1.1.2LIN 总线的研究现状 1.1.3基于 FPGA 实现 LIN 总线控制器的意义

Web前端和Java选哪个?哪个就业形势更好?

在招聘平台上看&#xff0c;Java的招聘需求远大于前端Web&#xff0c;但近几年前端技术发展迅猛&#xff0c;人们对于前端体验越来越重视了&#xff0c;前端岗位也越来越好了。发展前景都不错&#xff0c;不过做选择主要还是看个人兴趣&#xff0c;具体哪个好找工作还是看个人能…

asp.net老年大学信息VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net老年大学信息管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net老年大学信息管理系统…

vue中 axios get请求,使用formData传递参数给后台

简单记录一下axios get请求,使用formData传递参数给后台 // GET 请求传递 formData // get 请求传递formData const formData new FormData() formData.append(name,admin) const params new URLSearchParams(formData) // 链接地址 /api/user/login?nameadmin axios.g…

前端小案例 | 一个带切换的登录注册界面(静态)

文章目录 &#x1f4da;HTML&#x1f4da;CSS&#x1f4da;JS &#x1f4da;HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sc…

如何通过Photoshop将视频转换成GIF图片

一、应用场景 1、将视频转有趣动图发朋友圈 2、写CSDN无法上传视频&#xff0c;而可以用GID动图替代 3、其他 二、实现步骤 1、打开Photoshop APP 2、点击文件——导入——视频帧到图层 3、选择视频文件 4、配置视频信息&#xff0c;按照图片提示配置完毕之后&#xff0c;…