MementoPattern-备忘录模式

ZHIZRL / 2023-08-23 / 原文

在C#中,备忘录模式(Memento Pattern)是一种行为型设计模式,它允许你捕获一个对象的内部状态,并在需要时恢复该状态,而无需暴露对象的实现细节。备忘录模式可以在不破坏封装性的前提下,保存和恢复对象的状态。

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

Originator(原发器):负责创建一个备忘录对象,以记录自身的内部状态,并可以使用备忘录来恢复状态。原发器可以创建和恢复备忘录对象。

Memento(备忘录):存储原发器对象的内部状态。备忘录可以提供原发器需要的方法,但不暴露内部的状态细节。

Caretaker(负责人):负责保存备忘录对象。负责人可以存储一个或多个备忘录对象,并在需要时将备忘录对象返回给原发器。负责人不对备忘录的内容进行操作或检查。

下面是一个示例,展示如何在C#中使用备忘录模式保存和恢复对象的状态:

namespace MementoPattern_备忘录模式
{
    internal class Program
    {
        // Memento
        public class Memento
        {
            private readonly string _state;

            public Memento(string state)
            {
                _state = state;
            }
            public string GetState()
            {
                return _state;
            }
        }
        // Originator
        public class Originator
        {
            private string _state;
            public string GetState()
            {
                return _state;
            }
            public void SetState(string state)
            {
                _state = state;
            }
            public Memento SaveStateToMemento()
            {
                return new Memento(_state);
            }
            public void RestoreStateFromMemento(Memento memento)
            {
                _state = memento.GetState();
            }
        }
        // Caretaker
        public class Caretaker
        {
            private Memento _memento;
            public Memento GetMemento()
            {
                return _memento;
            }
            public void SetMemento(Memento memento)
            {
                _memento = memento;
            }
        }
        static void Main(string[] args)
        {
            Originator originator = new Originator();
            Caretaker caretaker = new Caretaker();

            originator.SetState("State 1");
            Console.WriteLine("Current State: " + originator.GetState());

            caretaker.SetMemento(originator.SaveStateToMemento());

            originator.SetState("State 2");
            Console.WriteLine("Current State: " + originator.GetState());

            originator.RestoreStateFromMemento(caretaker.GetMemento());
            Console.WriteLine("Restored State: " + originator.GetState());

            Console.Read();

            //输出结果
            //Current State: State 1
            //Current State: State 2
            //Restored State: State 1
        }
    }
}

在上述示例中,使用备忘录模式实现了一个Originator(原发器)对象和Caretaker(负责人)对象的交互。Originator对象保存了一个状态字段,并提供了保存和恢复状态的方法。Memento(备忘录)对象用于存储原发器的内部状态。Caretaker对象负责存储和返回备忘录对象。

在Client中,首先创建了Originator和Caretaker对象。然后通过设置和获取状态方法来操作Originator的状态,并通过SaveStateToMemento方法将状态保存到备忘录对象。之后,更改Originator的状态并输出当前状态。最后,通过RestoreStateFromMemento方法从备忘录对象中恢复原始状态。

备忘录模式的优点是可以提供对象的历史状态恢复功能,并且封装了状态的保存和恢复过程,使得客户端无需关注对象状态的具体实现细节。它可以在不破坏对象封装性的前提下,方便地保存和恢复对象的状态,提供了更好的可维护性和灵活性。