65.9K
CodeProject 正在变化。 阅读更多。
Home

备忘录模式

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (3投票s)

2008年10月2日

CPOL

1分钟阅读

viewsIcon

13786

备忘录设计模式是一种帮助保存对象内部状态到外部位置的模式,从而能够在需要时稍后恢复该状态。

引言

备忘录设计模式是一种帮助保存对象内部状态到外部位置的模式,从而能够在需要时稍后恢复该状态。

备忘录模式不会破坏内部状态的封装性。该模式很少使用,但在科学计算或电脑游戏中(例如保存游戏检查点)中非常有用。

备忘录模式的使用场景

您应该在以下情况下使用该模式

  • 你需要保存对象的状态,并在稍后使用保存的状态来恢复该状态。
  • 你不想暴露对象的内部状态。

UML 图

Memento Pattern UML

C# 示例

以下代码展示了如何实现该模式的示例

    #region Originator
    public class Originator<T>
    {
        #region Properties
        public T State { get; set; }
        #endregion

        #region Methods
        /// <summary>
        /// Creates a new memento to hold the current
        /// state
        /// </summary>
        /// <returns>The created memento</returns>
        public Memento<T> SaveMemento()
        {
            return (new Memento<T>(State));
        }

        /// <summary>
        /// Restores the state which is saved in the given memento
        /// </summary>
        /// <param name="memento">The given memento</param>
        public void RestoreMemento(Memento<T> memento)
        {           
            State = memento.State;
        }
        #endregion
    }
    #endregion

    #region Memento
    public class Memento<T>
    {
        #region Properties
        public T State { get; private set; }
        #endregion

        #region Ctor
        /// <summary>
        /// Construct a new memento object with the
        /// given state
        /// </summary>
        /// <param name="state">The given state</param>
        public Memento(T state)
        {
            State = state;
        }
        #endregion
    }
    #endregion

    #region Caretaker
    public class Caretaker<T>
    {
        #region Properties
        public Memento<T> Memento { get; set; }
        #endregion
    }
    #endregion

给定的示例展示了模式的三个部分:Originator(发起人)、Memento(备忘录)和 Caretaker(管理者)。

Caretaker(管理者)是 Memento(备忘录)的存储库。 你还可以看到,一旦创建了 Memento(备忘录)对象,就无法更改保存的状态,并且要保存新的 Memento(备忘录),你需要重新创建它。

让我们看一个如何在代码中使用该模式的示例

   Originator<string> org = new Originator<string>();

   org.State = "Old State";

   // Store internal state in the caretaker object
   Caretaker<string> caretaker = new Caretaker<string>();
   caretaker.Memento = org.SaveMemento();

   Console.WriteLine("This is the old state: {0}", org.State);

   org.State = "New state";

   Console.WriteLine("This is the new state: {0}", org.State);

   // Restore saved state from the caretaker
   org.RestoreMemento(caretaker.Memento);

   Console.WriteLine("Old state was restored: {0}", org.State);

   // Wait for user
   Console.Read(); 

如你所见,保存的状态被插入到 Caretaker(管理者)对象中,然后你可以将 Originator(发起人)的状态更改为你需要的任何状态。
为了恢复 Originator(发起人)的状态,你使用恢复方法,并将 Caretaker(管理者)保存的 Memento(备忘录)传递给它。

摘要

总结一下这篇文章,备忘录模式用于将封装的对象状态保存到外部对象中。 然后可以根据需要恢复该状态。

正如我之前所写,你想要使用该模式的地方是在科学计算或电脑游戏中,但它在其他地方也可能有所帮助。

© . All rights reserved.