ue3dC#中的备忘录设计模式

C#中的备忘录设计模式

分类:
ue3d - C#中的备忘录设计模式

Memento(备忘录)设计模式属于四组(GoF)设计模式的行为设计模式类别,本文3D天堂将解释什么是备忘录模式以及如何在C#中实现备忘录设计模式。

备忘录设计模式

Memento模式可以存储对象的内部状态,可以稍后使用存储的状态恢复对象,考虑一个游戏的设计,在这个游戏中,希望在不同的检查点或级别上存储给定对象的状态,稍后玩家将能够使用存储的状态恢复该对象,Memento设计模式将在这种情况下有所帮助。

四组 (GoF) 定义

在不违反封装的情况下,捕获并外部化对象的内部状态,以便稍后可以将对象恢复到该状态。

备忘录设计模式 – UML

ue3d - C#中的备忘录设计模式

上述UML图中的参与者是

  1. Memento:存储发起者对象的内部状态,状态变量表示内部状态。
  2. Originator:创建和使用纪念品,稍后使用备忘录的状态保存和恢复此类。
    • 状态变量表示发起者的内部状态。
    • 创建一个memento(CreateMemento)来保存originator的内部状态。
    • 设置一个备忘录(SetMemento)来恢复发起者的内部状态,此方法接受一个备忘录对象。
  3. Caretaker:这个类负责memento的保管,客户端永远不会直接访问备忘录对象,Caretaker对象负责客户端交互。

C#中的备忘录设计模式示例

问题陈述

用一个简单的游戏来理解C#中的备忘录设计模式。

  • 考虑一个包含三个级别的游戏。
  • 任何清除所有三个级别的玩家都将赢得比赛。
  • 玩家将获得三个生命线来赢得比赛。
  • 如果玩家清除任何中间级别(小于最终级别)并在下一级别失去生命线,那么它将再次从最后一个完整级别开始,这里的memento模式对于存储完成关卡的状态和恢复相同关卡很有用。

类图

ue3d - C#中的备忘录设计模式

上面类图中的参与者是

  1. Player:发起者类
  2. Memento:纪念类
  3. Caretaker : 看守类

C#中的备忘录模式代码

using System;
using System.Threading;

namespace MementoPatternDemo
{
    //'Memento' class
    public class Memento
    {
        public int Level;
        public int Score;
        public string Health;

        public Memento(int level, int score, string health)
        {
            this.Level = level;
            this.Score = score;
            this.Health = health;
        }
    }
    //'CareTaker' class
    public class CareTaker
    {
        // store a checkpoint for already crossed level
        public Memento LevelMarker;
    }
    //'Originator' Class
    public class Player
    {
        public int Level;
        public int Score;
        public string Health;
        public int lifeline = 3;

        public Memento CreateMarker(Player player)
        {
            return new Memento(player.Level, player.Score, player.Health);
        }

        public void RestoreLevel(Memento playerMemento)
        {
            this.Level = playerMemento.Level;
            this.Score = playerMemento.Score;
            this.Health = playerMemento.Health;
            this.lifeline -= 1;
        }

        public void DisplayPlayerInfo()
        {
            Console.WriteLine("Level: " + this.Level);
            Console.WriteLine("Score: " + this.Score);
            Console.WriteLine("Health: " + this.Health);
            Console.WriteLine("Lifeline left: " + this.lifeline);
        }
    }
    //'client'
    class Program
    {
        static void Main(string[] args)
        {
            // player has completed level 1
            Player player = new Player();
            player.Level = 1;
            player.Score = 100;
            player.Health = "100%";
            Console.WriteLine("----------- Player info after completing level 1 ---------------------");
            player.DisplayPlayerInfo();
            // when player completes any level then create checkpoint for that level.
            CareTaker careTaker = new CareTaker();
            careTaker.LevelMarker = player.CreateMarker(player);

            // sleep is only added to show some delay..
            Thread.Sleep(2000);

            player.Level = 2;
            player.Score = 130;
            player.Health = "80%";
            Console.WriteLine("--------------- Player info in level 2 --------------------------------");
            player.DisplayPlayerInfo();
            
            // if players loses all the lifeline then restore the game from level 1
            player.RestoreLevel(careTaker.LevelMarker);
            Console.WriteLine("------------- Player info after restoring level 1 data ----------------");
            player.DisplayPlayerInfo();
            Console.ReadLine();
        }
    }
}

最终结果

ue3d - C#中的备忘录设计模式

以上是3D天堂关于C#中的备忘录设计模式的全部内容,如果你有任何反馈,请随时在本页面下方留言。

相关信息

  • 类型:知识
  • 字数:608
  • 字符:4319
  • 适用软件:Unity
  • 说明:无
  • 编号:155523

热门内容

提示:3D天堂作为服务提供者,尊重网络版权及知识产权,对某些行为的发生不具备充分的监控能力,若无意间侵犯到您的权利,请 联系我们,我们会在收到信息后尽快给予处理。

本站文章版权归本站自创作者所有,未经允许不得转载!