.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();
    }
}
相关推荐
Aevget7 小时前
DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(二)
.net·wpf·界面控件·devexpress·ui开发·数据网格
从孑开始10 小时前
ManySpeech.MoonshineAsr 使用指南
人工智能·ai·c#·.net·私有化部署·语音识别·onnx·asr·moonshine
Andya_net10 小时前
网络安全 | 深入了解 X.509 证书及其应用
服务器·安全·web安全
qq_1838028712 小时前
Linux内核idr数据结构使用
linux·运维·服务器
码农-小林12 小时前
使用leaflet库加载服务器离线地图瓦片(这边以本地nginx服务器为例)
运维·服务器·nginx
噜啦噜啦嘞好13 小时前
Linux:库制作与原理
linux·运维·服务器
androidstarjack13 小时前
知乎服务器崩溃!
运维·服务器
ajassi200015 小时前
开源 Linux 服务器与中间件(四)服务器--Tomcat
linux·服务器·开源
wangbing112517 小时前
迁移服务器
运维·服务器
细节控菜鸡17 小时前
【排查实录】Web 页面能打开,服务器能通接口,客户端却访问失败?原因全在这!
运维·服务器·前端