• 设计模式之备忘录模式


    组成

    • Originator(发起者):需要对状态进行保存和读取的成员
    • Memotor(备忘录):备忘录对象中包含存储发起人状态的成员变量
    • Caretaker(备忘录管理者):用于管理备忘录对象的实现类

    类图

    实例类图

    代码

      1 /// <summary>
      2     /// 游戏场景
      3     /// </summary>
      4     class GameSence : IShow
      5     {
      6         public Hero GameHero { get; set; }
      7         public Monster GameMonster { get; set; }
      8 
      9         public void LoadMemento(GameMemento memento)
     10         {
     11             GameHero = memento.MementoHero;
     12             GameMonster = memento.MementoMonster;
     13         }
     14 
     15         public GameMemento SaveMemento()
     16         {
     17             return new GameMemento(GameHero, GameMonster);
     18         }
     19 
     20         public void AttackMonster()
     21         {
     22             GameHero.AttackMonster(GameMonster);
     23         }
     24 
     25         public void Show()
     26         {
     27             IShow show = GameHero;
     28             show.Show();
     29             show = GameMonster;
     30             show.Show();
     31         }
     32     }
     33 
     34   /// <summary>
     35     /// 怪物
     36     /// </summary>
     37     class Monster : IShow, ICloneable
     38     {
     39         private int _hp;
     40         public int HP
     41         {
     42             get
     43             {
     44                 return _hp >= 0 ? _hp : 0;
     45             }
     46             set
     47             {
     48                 _hp = value;
     49                 if (_hp <= 0)
     50                 {
     51                     Console.WriteLine("Monster Dead");
     52                     _hp = 0;
     53                 }
     54             }
     55         }
     56 
     57         #region IShow
     58 
     59         public void Show()
     60         {
     61             Console.WriteLine("Monster HP : " + HP);
     62         }
     63 
     64         #endregion
     65 
     66         public object Clone()
     67         {
     68             return MemberwiseClone();
     69         }
     70     }
     71 
     72 /// <summary>
     73     /// 角色
     74     /// </summary>
     75     class Hero : IShow, ICloneable
     76     {
     77         private int _hp;
     78         public int HP
     79         {
     80             get { return _hp; }
     81             set { _hp = value; }
     82         }
     83 
     84         private int _mp;
     85         public int MP
     86         {
     87             get { return _mp; }
     88             set
     89             {
     90                 _mp = value;
     91             }
     92         }
     93 
     94         public int Attack { get; set; }
     95 
     96         public void AttackMonster(Monster monster)
     97         {
     98             if (MP > 0)
     99             {
    100                 Console.WriteLine("Attack : " + Attack);
    101                 monster.HP = monster.HP - Attack;
    102                 MP--;
    103             }
    104             else
    105             {
    106                 Console.WriteLine("No Enough MP");
    107             }
    108         }
    109 
    110         #region IShow
    111         public void Show()
    112         {
    113             var info = string.Format("HP : {0} | MP : {1} | Attact : {2}", HP, MP, Attack);
    114             Console.WriteLine("Hero " + info);
    115         }
    116         #endregion
    117 
    118         public object Clone()
    119         {
    120             return MemberwiseClone();
    121         }
    122     }
    123 
    124    /// <summary>
    125     /// 游戏存档
    126     /// </summary>
    127     class GameMemento
    128     {
    129         public Hero MementoHero { get; set; }
    130         public Monster MementoMonster { get; set; }
    131 
    132         public GameMemento(Hero hero, Monster monster)
    133         {
    134             MementoHero = hero.Clone() as Hero;
    135             MementoMonster = monster.Clone() as Monster;
    136         }
    137     }
    138 
    139  /// <summary>
    140     /// 存档管理类
    141     /// </summary>
    142     internal class Caretaker
    143     {
    144         private GameMemento _memento;
    145 
    146         public void SetMemento(GameMemento memento)
    147         {
    148             ConsoleHelper.WriteImportString("Save Memento");
    149             _memento = memento;
    150         }
    151 
    152         public GameMemento GetMemento()
    153         {
    154             ConsoleHelper.WriteImportString("Load Memento");
    155             return _memento;
    156         }
    157     }
    业务代码
     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             GameSence game = new GameSence();
     6 
     7             var hero = new Hero
     8             {
     9                 Attack = 5,
    10                 HP = 100,
    11                 MP = 100
    12             };
    13             game.GameHero = hero;
    14 
    15             var monster = new Monster { HP = 400 };
    16             game.GameMonster = monster;
    17 
    18             game.Show();
    19             game.AttackMonster();
    20             game.Show();
    21             game.AttackMonster();
    22             game.Show();
    23             var caretaker = new Caretaker();
    24             caretaker.SetMemento(game.SaveMemento());
    25             game.AttackMonster();
    26             game.Show();
    27             game.LoadMemento(caretaker.GetMemento());
    28             game.Show();
    29 
    30             Console.ReadLine();
    31         }
    32     }
    客户端代码

    运行结果

    优点:待补充

    缺点:待补充

  • 相关阅读:
    多功能回到顶部组件,速度可调控,带隐藏效果,返回过程中可回滚。
    可扩展进度条,商城常用!
    多功能万能模态框插件,项目实用,持续更新中...
    前端页面重构技巧总结TIP【持续更新...】
    微信小程序入门实例之记事本
    webpack1.x环境配置与打包基础【附带各种 "坑" 与解决方案!持续更新中...】
    CSS3利用背景渐变和background-size配合完成渐变与条纹效果[持续更新中...]
    CSS3利用一个div实现内圆角边框效果
    CSS3实现原腾讯视频透明边框,多重边框等(关于边框那些不为人知的事情)
    使用条件注释完成浏览器兼容
  • 原文地址:https://www.cnblogs.com/XzcBlog/p/5201752.html
Copyright © 2020-2023  润新知