zoukankan      html  css  js  c++  java
  • 备忘录模式 -- 大话设计模式

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

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

    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();
            }
    
  • 相关阅读:
    centos7环境下使用xtrabackup备份mysql8.0自动化脚本
    ECharts series data 数组里面的元素,可以是对象
    Docker for Mac 配置镜像加速器,加快镜像下载速度
    sql函数split在presto、spark、hive中的不同
    字段类型为:map<string,string> 时,查询取值(必须使用单引号)
    vendor模式下get报错:go get: disabled by -mod=vendor,此时go env里 GOFLAGS=" -mod=vendor"
    Etcd使用go module的灾难(包依赖问题)
    Go time.Parse转时间戳为啥会自动加8小时?
    scala 下划线使用指南
    【Spark】遍历DataFrame中的每一行数据
  • 原文地址:https://www.cnblogs.com/amywechat/p/4929238.html
Copyright © 2011-2022 走看看