C#设计模式系列:备忘录模式(Memento)

C#设计模式系列:备忘录模式(Memento)

备忘录模式是一种行为型设计模式,它允许你将对象的状态保存到备忘录中并在以后的时间点将对象恢复到先前的状态。

适用场景

  • 需要即时保存和恢复内部状态的对象。
  • 当直接访问对象内部状态的成本比通过备忘录进行恢复操作更高时。
  • 需要保留对象状态历史记录的情况,以便回滚操作等。

实现方法

备忘录模式包含三个主要的角色:Originator、Memento、Caretaker。

Originator

Originator是需要保存状态的对象。它创建备忘录并使用它来恢复其内部状态。原发器提供了一个创建备忘录的方法,并实现了使用备忘录恢复其状态的方法。

public class Originator
{
    private string _state;

    public string State
    {
        get { return _state; }
        set
        {
            _state = value;
            Console.WriteLine($"State set to {_state}");
        }
    }

    public Memento CreateMemento()
    {
        Console.WriteLine("Creating memento...");
        return new Memento(_state);
    }

    public void RestoreFromMemento(Memento memento)
    {
        _state = memento.GetState();
        Console.WriteLine($"State restored to {_state}");
    }
}

Memento

Memento是原发器状态的快照。备忘录存储状态的一些简单数据结构。它只公开了两个方法:GetState()来获得之前记录的状态以及GetType(),通常可用于标识备忘录的类型。

public class Memento
{
    private readonly string _state;

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

    public string GetState()
    {
        return _state;
    }
}

Caretaker

Caretaker负责保存备忘录,并提供使用备忘录的方法。它不能访问备忘录的状态,它只管理备忘录的保存和恢复。

public class Caretaker
{
    private readonly List<Memento> _mementos = new List<Memento>();
    private Originator _originator;

    public Caretaker(Originator originator)
    {
        _originator = originator;
    }

    public void Backup()
    {
        _mementos.Add(_originator.CreateMemento());
    }

    public void Undo()
    {
        if (_mementos.Count == 0)
        {
            return;
        }

        var memento = _mementos.Last();
        _mementos.Remove(memento);

        _originator.RestoreFromMemento(memento);
    }

    public void ShowHistory()
    {
        Console.WriteLine("History:");
        foreach (var memento in _mementos)
        {
            Console.WriteLine(memento.GetState());
        }
    }
}

使用方法

var originator = new Originator { State = "On" };
var caretaker = new Caretaker(originator);

caretaker.Backup();
originator.State = "Off";

caretaker.Backup();
originator.State = "On";

caretaker.Backup();
originator.State = "Off";

caretaker.ShowHistory();

caretaker.Undo();
caretaker.Undo();
caretaker.Undo();

总结

备忘录模式是一种非常有用的设计模式,它允许我们对对象的状态进行保存和恢复。备忘录模式优雅的解决了在保存对象状态时所面临的问题,并提供了一种简单的方式来回滚到之前记录的状态。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#设计模式系列:备忘录模式(Memento) - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • 有道搜索和IP138的IP的API接口(PHP应用)

    有道搜索和IP138的IP的API接口攻略 介绍 有道搜索和IP138都提供了IP查询的API接口,可以通过发送HTTP请求获取IP的相关信息。本攻略将详细讲解如何使用PHP应用来调用这两个API接口,并提供两个示例说明。 准备工作 在开始之前,确保你已经具备以下条件:- 一台安装了PHP的服务器或本地开发环境。- 有道搜索和IP138的API密钥(如果需要…

    other 2023年7月31日
    00
  • Todo清单怎么用 Todo清单常见问题汇总

    Todo清单怎么用 简介 Todo清单是一种简单而常用的待办事项管理工具。它可以帮助用户快速记录需要完成的任务,并将它们分类、标注,方便用户在日常生活和工作中灵活高效地进行任务管理。下面是Todo清单的基本使用方法和常见问题汇总。 基本使用方法 安装Todo清单APP 在手机应用商店中搜索Todo清单,下载并安装。 创建新的任务 在Todo清单主页面,点击“…

    other 2023年6月27日
    00
  • java安装教程及环境配置

    Java安装教程及环境配置 Java是一种广泛应用的编程语言,若你需要在本地运行Java程序,首先需要在计算机上安装Java运行环境。在本文中,我们将为您介绍如何在Windows操作系统下安装Java,并在配置环境变量后测试安装是否成功。 步骤1:Java的安装 首先,在官网下载Java安装程序。下载地址可在Java官方网站上查找。 在下载页面中选择相应的J…

    其他 2023年3月28日
    00
  • IE10浏览器无法记住网站的登陆账号和密码的解决方法

    解决IE10浏览器无法记住网站的登陆账号和密码的方法有以下几步: 步骤一:检查IE10浏览器的设置 打开IE10浏览器,点击右上角的齿轮图标,选择Internet选项; 在弹出的Internet选项窗口中,选择“内容”选项卡,并点击“自动完成设置”按钮; 确认选中“用户名和密码在表单中填写”和“为我保存密码”两个选项,并点击“确定”按钮; 关闭所有IE10浏…

    other 2023年6月27日
    00
  • Ant Design Vue Pagination分页组件的封装与使用

    Ant Design Vue是基于Vue.js框架的UI组件库,提供了一系列优美且易于使用的组件,包括表格、表单、菜单栏、分页器等。其中,分页器Pagination是一个常用的组件,用于分页展示数据列表,本文将介绍Ant Design Vue Pagination分页组件的封装与使用。 安装Ant Design Vue Ant Design Vue的安装非常…

    other 2023年6月25日
    00
  • crypto.js下载

    Crypto.js下载 Crypto.js是一个JavaScript加密库,它提供了多种加密算法和工具,可以帮助我们在前端实现数据加密和解密。以下是Crypto.js下载的完整攻略。 步骤 以下是下载Crypto.js的步骤: 打开Crypto.js官网:https://cryptojs.gitbook.io/docs/ 点击“Download”按钮,下载C…

    other 2023年5月6日
    00
  • 通过案例详细聊聊Go语言的变量与常量

    通过案例详细聊聊Go语言的变量与常量 Go语言是一种静态类型、编译型的编程语言,它提供了丰富的变量和常量的定义和使用方式。在本文中,我们将通过案例来详细讲解Go语言中的变量和常量。 变量 变量的声明和初始化 在Go语言中,变量的声明和初始化可以分开进行,也可以一起进行。下面是一个示例: package main import \"fmt\&quot…

    other 2023年7月29日
    00
  • Win11刷新怎么设置为右键菜单的首选?

    要将Win11刷新设置为右键菜单的首选,需要进行以下步骤: 打开注册表编辑器: 按下Win + R键组合,输入regedit并回车,以启动注册表编辑器。 导航到右键菜单项所在的注册表分支: 在注册表编辑器中,使用左侧的目录导航器导航到以下路径: HKEY_CLASSES_ROOT\Directory\Background\shell 此处的“Director…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部