.NET高级面试指南专题二十九【备忘录模式介绍,用于需要撤销操作或在发生错误时恢复对象状态的情况】

备忘录模式是一种行为型设计模式,用于捕获对象的内部状态并在不破坏其封装性的情况下将其保存,以便稍后可以将对象恢复到先前的状态。这种模式通常用于需要撤销操作或在发生错误时恢复对象状态的情况。

原理

备忘录模式包含以下几个关键角色:

  • Originator(发起人):负责创建一个备忘录对象,以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。
  • Memento(备忘录):负责存储发起人的内部状态。备忘录可以有不同的实现,但通常包含了原发起人状态的部分或全部信息。
  • Caretaker(负责人):负责保存备忘录对象,但不能对备忘录进行操作或检查其内容。其主要作用是防止其他对象访问备忘录,确保只有发起人可以读取备忘录中的状态。

优点

  • 支持撤销操作:允许将对象恢复到之前的状态。
  • 封装性好:备忘录模式将状态信息封装在备忘录对象中,使得发起人对象不需要暴露其内部状态,从而提高了封装性和安全性。
  • 简化发起人:备忘录模式将存储状态的责任分离出来,使得发起人类的代码更加清晰简洁。

缺点

  • 资源消耗:如果需要保存大量的状态信息,会占用较多的内存资源。
  • 备忘录管理:负责人对象需要管理备忘录对象,可能会引入额外的复杂性。

C# 示例代码

csharp 复制代码
using System;

// 备忘录类
class Memento
{
    private string _state;

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

    public string GetState()
    {
        return _state;
    }
}

// 发起人类
class Originator
{
    private string _state;

    public string State
    {
        get { return _state; }
        set
        {
            Console.WriteLine("设置状态:" + value);
            _state = value;
        }
    }

    public Memento SaveStateToMemento()
    {
        Console.WriteLine("保存状态到备忘录");
        return new Memento(_state);
    }

    public void GetStateFromMemento(Memento memento)
    {
        _state = memento.GetState();
        Console.WriteLine("从备忘录恢复状态:" + _state);
    }
}

// 负责人类
class Caretaker
{
    private Memento _memento;

    public Memento Memento
    {
        get { return _memento; }
        set { _memento = value; }
    }
}

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

        originator.State = "状态1";
        originator.State = "状态2";
        caretaker.Memento = originator.SaveStateToMemento();

        originator.State = "状态3";

        originator.GetStateFromMemento(caretaker.Memento);

        Console.ReadKey();
    }
}
相关推荐
Eiceblue6 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
步、步、为营8 小时前
.net开源库SignalR
开源·.net
snoopyfly~10 小时前
Ubuntu 24.04 LTS 服务器配置:安装 JDK、Nginx、Redis。
java·服务器·ubuntu
追逐时光者10 小时前
一款开源免费、通用的 WPF 主题控件包
后端·.net
Me4神秘10 小时前
Linux国产与国外进度对垒
linux·服务器·安全
步、步、为营11 小时前
.net开源物联网项目IoTSharp
物联网·开源·.net
牛奶咖啡1313 小时前
Linux系统的常用操作命令——文件远程传输、文件编辑、软件安装的四种方式
运维·服务器·软件安装·linux云计算·scp文件远程传输·vi文件编辑·设置yum的阿里云源
weixin_4373982113 小时前
转Go学习笔记(2)进阶
服务器·笔记·后端·学习·架构·golang
百锦再13 小时前
.Net配置文件appsetting.json的几种读取方法
chrome·json·.net·依赖注入·appsetting·web.config