首页 > 其他分享 >19_备忘录模式

19_备忘录模式

时间:2024-03-15 09:57:31浏览次数:25  
标签:Level 19 模式 备忘录 state 对象 Exp public

备忘录模式是一种行为型设计模式,它可以捕获一个对象的内部状态,并在需要时将对象恢复到之前的状态。备忘录模式通过将对象的状态封装在备忘录对象中,使得可以在不暴露对象内部实现细节的情况下进行状态的保存和还原。

备忘录模式有三个主要角色:

  1. 发起人(Originator):负责创建备忘录对象,并可以通过备忘录对象保存和恢复自身的状态。发起人可以是具体类或接口。

  2. 备忘录(Memento):用于存储发起人对象的状态。备忘录是不可修改的,只能由发起人访问。

  3. 管理者(Caretaker):负责存储备忘录对象,以便在需要时进行恢复。管理者可以持有多个备忘录对象,用于保存多个状态。

备忘录模式的工作原理如下:

  1. 发起人创建备忘录对象,并将当前的状态保存到备忘录中。

  2. 管理者存储备忘录对象,以便在需要时进行恢复。

  3. 当发起人需要恢复到之前的状态时,可以通过从管理者获取备忘录对象,并将其状态恢复。

备忘录模式的优点包括:

  1. 提供了一种方式来保存和还原对象的状态,同时又不暴露对象的实现细节。

  2. 可以方便地实现撤销和恢复功能,以及实现多次撤销和恢复。

  3. 支持状态的封装和保护,使得对象的状态不会被外部访问和修改。

备忘录模式适用于以下场景:

  1. 当需要保存和还原对象的状态,并且不希望暴露对象内部细节时,可以使用备忘录模式。

  2. 当需要实现撤销和恢复功能,以及多次撤销和恢复时,可以使用备忘录模式。

总结而言,备忘录模式通过将对象的状态封装在备忘录对象中,允许在需要时保存和还原对象的状态。它提供了一种简洁的方式来实现状态的保存和恢复,同时保护了对象的状态不被外部访问和修改。

 

IOriginator

 /// <summary>
    /// 发起人抽象接口
    /// </summary>
    public interface IGameState
    {
        /// <summary>
        /// 等级
        /// </summary>
        int Level { get; set; }
        /// <summary>
        /// 经验值
        /// </summary>
        int Exp { get; set; }
    }

Originator

/// <summary>
    /// 发起人实现
    /// </summary>
    public class GameState : IGameState
    {
        /// <summary>
        /// 等级
        /// </summary>
        public int Level { get; set; }
        /// <summary>
        /// 经验值
        /// </summary>
        public int Exp { get; set; }

        /// <summary>
        /// 备份
        /// </summary>
        /// <returns></returns>
        public Memo Create()
        {
            return new Memo(Level, Exp);
        }

        /// <summary>
        /// 还原
        /// </summary>
        /// <param name="memo"></param>
        public void Restore(Memo memo)
        {
            Level= memo.Level;
            Exp= memo.Exp;
        }

        public void Display()
        {
            Console.WriteLine($"Level等级:{Level},Exp经验值:{Exp}");
        }
    }

 

Memento

/// <summary>
    /// 备忘录
    /// </summary>
    public class Memo : IGameState
    {
        /// <summary>
        /// 等级
        /// </summary>
        public int Level { get; set; }
        /// <summary>
        /// 经验值
        /// </summary>
        public int Exp { get; set; }

        public Memo(int level, int exp)
        {
            Level = level;
            Exp = exp;
        }
    }

 

Caretaker

 public class Caretaker
    {
        private Memo Memo { get; set; }

        /// <summary>
        /// 备份
        /// </summary>
        /// <param name="gameState"></param>
        public void Backup(GameState gameState)
        {
            Console.WriteLine("管理者正在备份游戏数据");
            Memo = gameState.Create();
        }

        /// <summary>
        /// 还原
        /// </summary>
        /// <param name="gameState"></param>
        public void Restore(GameState gameState)
        {
            Console.WriteLine("管理者正在还原游戏状态");
            gameState.Restore(Memo);
        }
    }

 

调用

public class Client
    {
        public void Start()
        {
            GameState state = new GameState();
            state.Level= 1;
            state.Exp = 100;
            state.Display();

            Console.WriteLine("-------------------------------");

            Caretaker caretaker = new Caretaker();
            caretaker.Backup(state);//备份

            //修改游戏数据
            state.Level= 2;
            state.Exp= 200;
            state.Display();


            //还原游戏数据
            caretaker.Restore(state);
            state.Display();
        }
    }
static void Main(string[] args)
        {
            new Client().Start();
            Console.ReadKey();
            Console.WriteLine("Hello, World!");
        }

 

标签:Level,19,模式,备忘录,state,对象,Exp,public
From: https://www.cnblogs.com/MingQiu/p/18074744

相关文章

  • P8681 [蓝桥杯 2019 省 AB] 完全二叉树的权值
    题目描述给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是​,如下图所示: 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。注:根的深度是 1......
  • 4.static应用-单例设计模式
    什么是设计模式,设计模式主要学什么,单例模式解决了什么问题?设计模式就是具体问题的最有解决方案解决了什么问题?怎么写?确保一个类只有一个对象单例怎么写,饿汉式单例的特点是什么?把类的构造器私有;定义一个类变量存储类的一个对象;提供一个类方法返回对象在获取类的对象时,对......
  • day-19 合并后数组中的最大元素
    思路:从后向前遍历数组,用tans记录每一种可能的最大值,ans为实际最大值。注意:若ans==0,返回nums[0]要用longcodeclassSolution{publiclongmaxArrayValue(int[]nums){longans=0;longtans=0;booleanflag=true;for(in......
  • CF1927G. Paint Charges
    Problem-1927G-Codeforces做这道题的时候自己把\(dp\)式子卡的太死了,导致怎么想都想不出来,但正解的\(dp\)设的是很宽松的设\(dp_{i,j,k}\)表示考虑前\(i\)个数,所有中第一个没被染色的是\(j\),在\(i\)后面第一个没被染到的是\(k\)转移就判断第\(i\)个数......
  • CTF练习日记——[极客大挑战 2019]EasySQL
    启动靶机后,首先能看到这样一个界面:这个题是和SQL注入相关,首先随意输入username和password试试看:提示用户名和密码错误,那么我们尝试输入用户名输入1',得到提示SQL语句出错,那么我们就可以从这里下手,直接在用户名那输入1'or'1'='1#注入成功,得到了我们需要的flag:flag{08f72......
  • CTF练习日记——[极客大挑战 2019]Havefun 1
    开启靶机后,看到该界面,一只可爱的小猫,题目也没有更多信息,查看源代码试试看我们可以看到这样一段代码,我们试试cat=dog,发现结果自己出来了,得到了flag:flag{4962ffca-1564-415b-b9e0-77699a797784}......
  • 多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)
    设计模式是什么类似于棋谱一样的东西计算机圈子里的大佬为了能让小菜鸡的代码不要写的太差针对一些典型的场景,给出了一些典型的解决方案这样小菜鸡们可以根据这些方案(ACM里面叫板子,象棋五子棋里叫棋谱,咱这里叫设计模式),略加修改,这样代码再差也差不到哪里去......
  • 利用jmeter命令行模式对influxdb查询api进行压力测试
    需求说明物联网指标数据(车辆的轨迹、里程、速度等)存储在influxDB中。需要对指标查询服务的性能做压力测试。背景1、javaservice已经对influxDB查询sql做了封装,api参数如下:{"deviceIds":["14146284645"],"startTime":1710259200000,"endTime":17104320......
  • 实现eventEmmiter,发布-订阅 模式 (on, emit, off)
    /* *@Date:2024-03-1415:46:52 *@Description:Modifyhereplease */interfaceSubscribeEvent{ fn:Function; once:boolean;}classEventEmmiter{ subscribes:Map<string,Array<SubscribeEvent>>; constructor(){  this.subscrib......
  • 有趣的css - 暗黑模式切换开关
    大家好,我是Just,这里是「设计师工作日常」,今天分享的是用css打造一个切换界面暗黑模式的按钮开关,通过点击来切换太阳和月亮的图标。《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。目录整体效果核心代码html代码css部分代码完整代码如下html页面c......