设计模式之备忘录模式(Memento)

备忘录模式定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

    /// <summary>
    /// 魔兽争霸
    /// </summary>
    public class War3
    {
        public string Race { get; set; }
        public string Hero { get; set; }
        public string Army { get; set; }
        public string Resource { get; set; }

        public void Show()
        {
            Console.WriteLine("********************************");
            Console.WriteLine("     Race:{0}", this.Race);
            Console.WriteLine("     Hero:{0}", this.Hero);
            Console.WriteLine("     Army:{0}", this.Army);
            Console.WriteLine("Resource:{0}", this.Resource);
            Console.WriteLine("********************************");
        }
        
        public void Save(string name)
        {
            War3Memento memento = new War3Memento(this.Hero, this.Army, this.Resource);
            Caretaker.SaveWar3Memento(name, memento);
        }

        public void Load(string name)
        {
            War3Memento memento = Caretaker.GetWar3Memento(name);

            this.Army = memento.Army;
            this.Hero = memento.Hero;
            this.Resource = memento.Resource;
        }
    }

备忘类,备忘War3中的部分属性。

    /// <summary>
    /// 魔兽争霸备忘
    /// </summary>
    public class War3Memento
    {
        public string Hero { get; private set; }
        public string Army { get; private set; }
        public string Resource { get; private set; }

        public War3Memento(string hero, string army, string resource)
        {
            this.Hero = hero;
            this.Army = army;
            this.Resource = resource;
        }
    }

缓存类,使用容器进行缓存:

    /// <summary>
    /// 第三方保存容器:txt xml db  缓存  内存
    /// </summary>
    public class Caretaker
    {
        private static Dictionary<string, War3Memento> _War3MementoDictionary = new Dictionary<string, War3Memento>();
        public static void SaveWar3Memento(string name, War3Memento war3Memento)
        {
            _War3MementoDictionary.Add(name, war3Memento);
        }

        public static War3Memento GetWar3Memento(string name)
        {
            if (_War3MementoDictionary.ContainsKey(name))
                return _War3MementoDictionary[name];
            else
                throw new Exception("wrong name");
        }
    }

调用方代码如下:

                War3 war3 = new War3()
                {
                    Race = "Undead",
                    Hero = "Level 1 DK",
                    Army = "5只食尸鬼",
                    Resource = "200G 200W"
                };
                war3.Save("Start");
                war3.Show();

                Console.WriteLine("*****MF*******");
                war3.Hero = "3级DK1级Lich";
                war3.Army = "5只蜘蛛2只食尸鬼";
                war3.Resource = "500G 300W";
                war3.Save("MF");
                war3.Show();

                Console.WriteLine("*****交战*******");
                war3.Hero = "4级DK 3级Lich 1级小强";
                war3.Army = "1只憎恶6只蜘蛛1只雕像";
                war3.Resource = "1000G 1500W";
                war3.Save("交战");

                Console.WriteLine("*****决战*******");
                war3.Hero = "5级DK 4级Lich 3级小强";
                war3.Army = "2只憎恶8只蜘蛛2只雕像";
                war3.Resource = "1000G 1500W";
                war3.Save("决战");

                Console.WriteLine("*****决战后*******");
                war3.Hero = "6级DK 6级Lich 3级小强";
                war3.Army = "1只憎恶2只蜘蛛1只冰龙";
                war3.Resource = "10G 1200W";
                war3.Save("决战后");

                war3.Load("Start");
                war3.Show();
                war3.Load("MF");
                war3.Show();
                war3.Load("交战");
                war3.Show();
                war3.Load("决战");
                war3.Show();
                war3.Load("决战后");
                war3.Show();

要点总结

备忘录模式主要思想是——利用备忘录对象来对保存发起人的内部状态,当发起人需要恢复原来状态时,再从备忘录对象中进行获取,在实际开发过程也应用到这点,例如数据库中的事务处理。

备忘录模式的适用场景:
如果系统需要提供回滚操作时,使用备忘录模式非常合适。例如文本编辑器的Ctrl+Z撤销操作的实现,数据库中事务操作。

备忘录模式的优缺点
优点:
如果某个操作错误地破坏了数据的完整性,此时可以使用备忘录模式将数据恢复成原来正确的数据。
备份的状态数据保存在发起人角色之外,这样发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理者角色管理,符合单一职责原则。

缺点:
在实际的系统中,可能需要维护多个备份,需要额外的资源,这样对资源的消耗比较严重。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值