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

在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……

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

1.游戏打Boss前,习惯性存档

  游戏角色站在副本外,思考中……,思考结束,开启外挂模式(存档,打不过重新再来……(*^__^*) 嘻嘻……),再次检查人物状态,是否满血满蓝~。进副本,遇见Boss就跪了~,赶紧出来,一阵后怕,还好哥有存档,要不白瞎了3个月的泡面钱~

  首先定义一个游戏角色类,内置创建备忘录和恢复备忘录功能

    /// <summary>
    /// 游戏角色(发起人对象:负责创建备忘录,用以记录当前时刻它的内部状态)
    /// </summary>
    public class GameCharacter
    {
        /// <summary>
        /// 需要保持的属性,可能有多个
        /// </summary>
        public string State { get; set; }

        /// <summary>
        /// 创建备忘录
        /// </summary>
        public Memento CreateMemento()
        {
            return new Memento(this.State);
        }

        /// <summary>
        /// 恢复备忘录
        /// </summary>
        public void SetMemento(Memento memento)
        {
            State = memento.State;
        }

        /// <summary>
        /// 显示角色状态
        /// </summary>
        public void Show()
        {
            Console.WriteLine("游戏角色当前状态:{0}", this.State);
        }
    }

   定义备忘录类,来存储游戏角色的当前各种状态

    /// <summary>
    /// 备忘录(负责存储发起人对象的内部状态,并可防止发起人以外的其他对象范文备忘录)
    /// </summary>
    public class Memento
    {
        public Memento(string state)
        {
            this.State = state;
        }

        public string State { get; set; }
    }

   定义备忘录管理类,仅仅负责存储备忘录

    /// <summary>
    /// 管理者(负责保持备忘录对象,不能对备忘录的内容进行操作活检查)
    /// </summary>
    public class Caretaker
    {
        public Memento Memento { get; set; }
    }

   开启场景模拟

        static void Main(string[] args)
        {
            //游戏角色站在副本外,思考中……
            GameCharacter ter = new GameCharacter();
            ter.State = "马上进副本了,赶紧保存一下,当前状态:满血、满蓝!";

            //思考结束,开启外挂模式(存档,打不过重新再来……(*^__^*) 嘻嘻……)
            Caretaker caretaker = new Caretaker();
            caretaker.Memento = ter.CreateMemento();

            //再次检查人物状态,是否满血满蓝~
            ter.Show();

            //进副本,遇见Boss就跪了~
            ter.State = "我靠,BOSS太BT,直接跪了/(ㄒoㄒ)/~~";
            ter.Show();

            //赶紧出来,一阵后怕,还好哥有存档,要不白瞎了3个月的泡面钱~
            ter.SetMemento(caretaker.Memento);
            ter.Show();
        }

 

posted @ 2015-11-02 09:31  荒古禁地  阅读(179)  评论(0编辑  收藏  举报