大话设计模式:备忘录模式

一世执手 提交于 2019-12-19 06:07:14

一、什么是备忘录模式

在不破坏对象内部状态的情况,捕获状态,并在外部保存该状态

保存一个对象的某一状态,以便在适当的时候恢复对象,这样对象就能恢复到之前的状态了。提供了可以恢复状态的机制,发起人可以让其恢复到某个历史状态。

UML图

在这里插入图片描述
Originator:发起人类,到时候需要存储它的不同状态,里面有一个存储状态方法和一个 恢复状态方法
Memento:备忘录,里面就是一堆数据,发起人类需要存储的数据
Caretaker:管理者,管理备忘录

二、适用场景

需要保存恢复的场景,可以回滚的操作.比如游戏的存档,你在打Boss之前可以先存一下档,然后这局boss打的不理想,就能恢复到存档的状态。比如浏览网页时跳到下一页,也可以回退到上一页。比如手机APP的一些操作,都可以回退。VS编写代码就可以很好的回退,使用Ctrl+Z ,Ctrl+Y操作。

三、优缺点

优点
可以保存想要的状态,在适当的时机恢复到该状态
封装了信息细节

缺点
资源消耗大,占用存储空间

四、大话中的例子

李逍遥战斗的例子, 在战斗之初 状态都是满的,存下档, 进去和boss战斗,状态都为0了,恢复一下状态, 状态又满了。李逍遥的类,属性:攻击 ,属性:生命值,存储状态的方法, 恢复状态的方法。一个备忘录,属性就是李逍遥的那些需要保存的属性。 一个管理器类,持有备忘录。李逍遥和管理器耦合。

五、我的例子

using System;


namespace MementoMode
{
    class Program
    {
        static void Main(string[] args)
        {
            Caretaker caretaker = new Caretaker();
            Naruto naruto = new Naruto();
            naruto.Show();//初始的状态

            naruto.FightingWithSoldier();//打过第一关
            naruto.FightingWithSoldier();//打过第二关
            naruto.Show();
            caretaker.Memen = naruto.CreateMemento();//存下来

            naruto.FightingWithSoldier();//打过第三关
            naruto.Show();
            naruto.FightingWithBoss();//打boss
            naruto.Show();
            naruto.SetMemento(caretaker.Memen);//恢复存档
            naruto.Show();
            Console.ReadKey();
        }
    }

    class Naruto
    {
        int lv;
        int hp;
        int atk;
        public int Level { get => lv; set => lv = value; }
        public int HP { get => hp; set => hp = value; }
        public int Attack { get => atk; set => atk = value; }

        public Naruto()
        {
            lv = 1;
            hp = 100;
            atk = 20;
        }
        public Memento CreateMemento()
        {
            return new Memento(lv, hp, atk);
        }

        public void SetMemento(Memento memento)
        {
            lv = memento.Level;
            hp = memento.HP;
            atk = memento.Attack;
        }

        public void FightingWithSoldier()
        {
            lv += 1;
            hp += 10;
            atk += 2;
        }

        public void FightingWithBoss()
        {
            lv = 1;
            hp = 0;
            atk = 0;
        }
        public void Show()
        {
            Console.WriteLine("等级:{0},血量:{1},攻击力:{2}", lv, hp, atk);
        }
    }

    class Memento
    {
        int lv;
        int hp;
        int atk;
        public int Level { get => lv; set => lv = value; }
        public int HP { get => hp; set => hp = value; }
        public int Attack { get => atk; set => atk = value; }
        public Memento(int lv, int hp, int atk)
        {
            this.lv = lv;
            this.hp = hp;
            this.atk = atk;
        }
    }

    class Caretaker
    {
        Memento memen;
        public Memento Memen { get => memen; set => memen = value; }
    }


}

运行结果

在这里插入图片描述
PS:备忘录模式是比较常用的模式,在项目中时常需要保存状态,并恢复到想要的状态,但该模式下如果保存数据过多哦,会消耗过多性能,内存使用过多。和原型模式有些像, 不过原型模式是创建型, 备忘录模式是行为型,原型模式是拷贝一份和原对象一模一样的备份对象存储起来, 备忘录只是摘选需要的属性和数据存储。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!