学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

模式的定义与特点

      在备忘录模式(Memento Pattern)下,为的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

模式的优点

  • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
  • 实现了信息的封装,使得用户不需要关心状态的保存细节。

模式的缺点

  • 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。
  • 为了符合迪米特原则,还要增加一个管理备忘录的类。

举例使用场景

      我们写代码的时候,写着写着发现有问题,只好Ctrl+Z或者Command+Z撤回;又好像是游戏中的存档问题;也像是Git和SVN的版本控制;再或关卡编辑器。

using DesignPattern.ChainofResponsibilityPattern;
using DesignPattern.MementoPattern;
using DesignPattern.ObserverPattern;
using DesignPattern.VisitorPattern;
using System;
using System.Collections.Generic;

namespace DesignPattern
{
    internal class Program
    {
        static void Main(string[] args)
        {
            MementoHelper();
        }

        #region Pattern - Memento
        static void MementoHelper()
        {
            Originator _originator = new Originator();
            CareTaker _careTaker = new CareTaker();
            _originator.SetInfo("Name 1", 10);
            _careTaker.Add(_originator.SaveInfoToMemento());
            _originator.SetInfo("Name 2", 18);
            _originator.SetInfo("Name 3", 25);
            _careTaker.Add(_originator.SaveInfoToMemento());
            _originator.SetInfo("Name 4", 80);

            Console.WriteLine("当前信息为: name = " + _originator.GetName() + ", age = " + _originator.GetAge());
            _originator.GetInfoFromMemento(_careTaker.Get(0));
            Console.WriteLine("第一次保存信息为: name = " + _originator.GetName() + ", age = " + _originator.GetAge());
            _originator.GetInfoFromMemento(_careTaker.Get(1));
            Console.WriteLine("第二次保存信息为: name = " + _originator.GetName() + ", age = " + _originator.GetAge());
            Console.ReadLine();
        }
        #endregion
    }
}

//====================================================================================================================


namespace DesignPattern.MementoPattern
{
    /// <summary>
    /// 备忘录
    /// 包含了要被恢复的对象的状态
    /// </summary>
    public class Memento
    {
        //也可以为别的内容,eg: 一个class
        private string m_name;
        private int m_age;

        public Memento(string name, int age)
        {
            this.m_name = name;
            this.m_age = age;
        }

        public string GetName()
        {
            return m_name;
        }
        public int GetAge()
        {
            return m_age;
        }
    }

    /// <summary>
    /// 管理人
    /// 负责从 Memento 列表中恢复 Memento 存储对象到某一状态。
    /// </summary>
    public class CareTaker
    {
        public CareTaker()
        {
            m_mementoList = new List<Memento>();
        }

        private List<Memento> m_mementoList;

        public void Add(Memento state)
        {
            m_mementoList.Add(state);
        }

        public Memento Get(int index)
        {
            return m_mementoList[index];
        }
    }
    
    /// <summary>
    /// 发起人,可以是被存储对象,也可以是被存储对象的class.
    /// 创建 Memento 并在被创建的 Memento 对象中存储 该被存储的内容
    /// </summary>
    public class Originator
    {
        private string m_name;
        private int m_age;

        public void SetInfo(string name, int age)
        {
            this.m_name = name;
            this.m_age = age;
        }

        public string GetName()
        {
            return m_name;
        }
        public int GetAge()
        {
            return m_age;
        }

        public Memento SaveInfoToMemento()
        {
            return new Memento(m_name, m_age);
        }

        public void GetInfoFromMemento(Memento Memento)
        {
            m_name = Memento.GetName();
            m_age = Memento.GetAge();
        }
    }
}

 


希望大家:点赞,留言,关注咯~    
????????????????

唠家常

今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们????

今日推荐