MementoPattern-备忘录模式

在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方法从备忘录对象中恢复原始状态。

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

 

备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装的前提下捕获一个对象的内部状态,并将该状态保存在一个备忘录对象中,以便在需要时进行恢复。备忘录模式具有以下优点和缺点:

优点:

  1. 实现了信息的封装与隔离:备忘录模式通过将对象的状态存储在备忘录对象中,实现了信息的封装与隔离。通过备忘录对象的保存和恢复操作可以与原对象解耦,不破坏原对象的封装性。

  2. 简化原对象的设计:备忘录模式可以使原对象的设计更加简洁。原对象只需关注核心业务逻辑,而状态的保存和恢复操作交给备忘录对象处理。

  3. 提供了快照与回滚的功能:备忘录模式可以在不破坏对象封装性的情况下,随时保存对象的内部状态,并可以在需要的时候进行恢复,实现了快照与回滚的功能。

  4. 支持多次撤销操作:备忘录模式可以保存多个备忘录对象,支持多次撤销操作。可以根据需求选择回滚到不同的状态。

缺点:

  1. 可能导致资源占用:备忘录模式中,备忘录对象需要保存对象的状态,如果状态较多或者状态较大,可能会占用较多的内存资源。

  2. 可能影响性能:备忘录模式在保存和恢复对象状态时,需要进行数据的读写操作,可能会影响性能。

  3. 破坏了封装性:如果备忘录模式的实现方式不当,可能会破坏对象的封装性。备忘录对象可能需要访问原对象的私有属性或方法,需要谨慎设计。

需要根据具体的应用场景和需求来评估使用备忘录模式的利弊。备忘录模式适用于需要保存和恢复对象状态的情况,以便于进行撤销操作或者实现快照与回滚的需求。通过权衡其优点和缺点,可以选择是否使用备忘录模式。

posted @ 2023-08-23 10:57  ZHIZRL  阅读(8)  评论(0编辑  收藏  举报