.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();
    }
}
相关推荐
生活很暖很治愈5 分钟前
Linux——孤儿进程&进程调度&大O(1)调度
linux·服务器·ubuntu
HalvmånEver21 分钟前
Linux:线程同步
linux·运维·服务器·线程·同步
喵叔哟22 分钟前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
Zach_yuan24 分钟前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
岁杪杪27 分钟前
关于运维:LINUX 零基础
运维·服务器·php
2501_9307077841 分钟前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
tianyuanwo1 小时前
企业级NTP客户端配置指南:基于内部NTP服务器的实践
运维·服务器·ntp客户端
_别来无恙_2 小时前
TFTP的使用Linux
linux·服务器
gaize12132 小时前
Moltbot(Clawdbot) 专属轻量服务器
运维·服务器
Zaralike2 小时前
Linux 服务器网络不通排查 SOP(标准操作流程)
linux·服务器·网络