zoukankan      html  css  js  c++  java
  • 《大话设计模式》学习笔记14:备忘录模式

      

      

    游戏进度备忘示例:

      

    1.Originator:

        public class GameRole
        {
            public int Vitality { get; set; }
            public int Attack { get; set; }
            public int Defense { get; set; }
            //状态显示
            public void StateDisplay()
            {
                Console.WriteLine("角色当前状态:体力 {0},攻击力 {1},防御力 {2}", Vitality, Attack, Defense);
            }
            //获得初始状态
            public void GetInitState()
            {
                Vitality = 100;
                Attack = 100;
                Defense = 100;
            }
            //战斗
            public void Fight()
            {
                Vitality = 0;
                Attack = 0;
                Defense = 0;
            }
            
            public RoleStateMemento SaveState()
            {
                return new RoleStateMemento(Vitality, Attack, Defense);
            }
            public void RecoveryState(RoleStateMemento roleStateMemento)
            {
                Vitality = roleStateMemento.Vitality;
                Attack = roleStateMemento.Attack;
                Defense = roleStateMemento.Defense;
            }
        }

    2.Memento:

        public class RoleStateMemento
        {
            public int Vitality { get; set; }
            public int Attack { get; set; }
            public int Defense { get; set; }
    
            public RoleStateMemento(int vitality,int attack,int defense)
            {
                Vitality = vitality;
                Attack = attack;
                Defense = defense;
            }
        }

    3.Caretaker:

        public class RoleStateCaretaker
        {
            public RoleStateMemento RoleStateMemento { get; set; }
    
        }

    4.客户端代码:

        class Program
        {
            static void Main(string[] args)
            {
                GameRole gameRole = new GameRole();
                gameRole.GetInitState();
                gameRole.StateDisplay();
    
                RoleStateCaretaker roleStateCaretaker = new RoleStateCaretaker();
                roleStateCaretaker.RoleStateMemento = gameRole.SaveState();
    
                gameRole.Fight();
                gameRole.StateDisplay();
    
                gameRole.RecoveryState(roleStateCaretaker.RoleStateMemento);
                gameRole.StateDisplay();
            }
        }

      备忘录模式比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。

      如果某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。

  • 相关阅读:
    day14(JavaDoc)
    day15(Java流程控制)
    day12
    day.6
    day10
    day11(运算符)
    day.5
    proc -x cshell fork()
    I/O -x 标准IO fopen-fclose--fgetc-fputc--fgets-fputs--fwrite-fread--fprintf-fscanf
    I/O -x open()-read()-write()-close()-lseek()
  • 原文地址:https://www.cnblogs.com/walden1024/p/4510129.html
Copyright © 2011-2022 走看看