Memento模式(存档点模式)-创新互联

模式简介

Memento模式用于记录存档点,然后可以通过加载存档点回溯到指定的存档或状态。

成都创新互联公司专业提供电信机房托管服务,为用户提供五星数据中心、电信、双线接入解决方案,用户可自行在线购买电信机房托管服务,并享受7*24小时金牌售后服务。模式UML图

代码示例(C#)

提示:文本内容存储在.txt文件中,所以v_textPath常量记录的是你的.txt文件路径;文本操作命令存储在.json文件中,所以v_paramsPath常量记录的是你的.json文件路径;你需要将二者更换为你所运行本机的相应文件路径;由于该模式代码与Iterator模式和Command模式代码存在联动,故无法单独运行,若需要运行,请自行复制本栏目下Iterator模式和Command模式的示例代码,或者从本栏目的资源篇“设计模式代码示例合集”下载所有完整代码资源。

using System.IO;
using System.Text.Json;

namespace Test1
{
    //文本和文本操作命令的存储与加载功能的具体实现类
    public class CommandChainManager : IMemento
    {
        private const string v_textPath = @"D:\Study\StudyNotes\Gamemade notes\ProgramPractice\Test1\源文件\Datas\data.txt";
        private const string v_paramsPath = @"D:\Study\StudyNotes\Gamemade notes\ProgramPractice\Test1\源文件\Datas\params.json";
        public void LoadCommand(ref CommandChain p_commandChain)
        {
            string v_jsonStr = "";
            using (StreamReader sr = File.OpenText(v_paramsPath))
            {
                v_jsonStr = sr.ReadToEnd();
            }
            var options = new JsonSerializerOptions
            {
                IncludeFields = true
            };
            CSFParameter[][] parameters = JsonSerializer.Deserialize(v_jsonStr, options);
            p_commandChain.parameters.Clear();
            foreach (CSFParameter[] param in parameters)
            {
                p_commandChain.parameters.Add(param);
            }
        }

        public void LoadText(ref string p_text)
        {
            using (StreamReader sr = File.OpenText(v_textPath))
            {
                p_text = sr.ReadToEnd();
            }
        }

        public void SaveCommands(CommandChain p_commandChain)
        {
            var options = new JsonSerializerOptions
            {
                IncludeFields = true
            };
            string v_jsonStr = JsonSerializer.Serialize(p_commandChain.parameters.ToArray(), options);
            File.WriteAllText(v_paramsPath, v_jsonStr);
        }

        public void SaveText(string p_text)
        {
            File.WriteAllText(v_textPath, p_text);
        }
    }

    //实现文本和文本操作命令存储与加载的接口
    public interface IMemento
    {
        public void SaveText(string p_text);
        public void LoadText(ref string p_text);
        public void SaveCommands(CommandChain p_commandChain);
        public void LoadCommand(ref CommandChain p_commandChain);
    }
}
代码解说

结合Command模式,我们对一个文本编辑器进行了简单的模拟,我们可以添加、删除、复制文本,同时还可以存储和加载命令状态。这个命令状态存储比较特殊,存储数据会覆盖当前的命令及其状态,这说明我们既保存了文本也保存了对文本的操作命令,当我们重新加载后文本和当时相关的操作命令都会一起恢复。文本则是以.txt文件进行保存的,而文本操作命令则是以.json文件进行保存的。

如果这篇文章对你有帮助,请给作者点个赞吧!

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网页名称:Memento模式(存档点模式)-创新互联
文章来源:http://pwwzsj.com/article/dpejgo.html