当前位置: 首页 > news >正文

天津通用网站建设收费前端开发工具哪个好

天津通用网站建设收费,前端开发工具哪个好,wordpress安装502,做一网站需要多少钱需求 撤销与重做功能 思考 关于记录的数据的两点思考: 记录操作记录影响显示和逻辑的所有数据 很显然这里就要考虑取舍了: 记录操作 这种方案只需要记录每一步的操作,具体这个操作要怎么渲染和实现出来完全需要自己去实现,这…

需求

撤销与重做功能

思考

关于记录的数据的两点思考:

  1. 记录操作
  2. 记录影响显示和逻辑的所有数据

很显然这里就要考虑取舍了:
记录操作 这种方案只需要记录每一步的操作,具体这个操作要怎么渲染和实现出来完全需要自己去实现,这种方式的好处是记录的数据量比较小,节省内存,但业务逻辑复杂,适合复杂庞大的数据记录
记录影响显示的所有数据 这种方案要记录所有影响显示和逻辑的所有数据,无疑,这种数据量肯定是比第一种大的,内存占用会比较大,但是业务逻辑简单

这里由于我的数据量不大所以选择了第二种方式来进行处理

首先肯定要有一个Manager来负责管理数据并实现撤销和重做的分发(我命名为UndoManager),还要有一个数据对象来记录每一步的数据,由于需要记录的信息未知,可能是一个json也可能是一个对象,所以这里用最抽象的接口来表示每一步的数据信息,后续怎么处理这份数据完全根据项目需求自己定制(我命名为IRecordData)

Redo Undo的功能都是先进后出的数据结构,这种数据结构对应到程序世界的话刚好对应的是Stack,这里就先用Stack来进行思考
定义有两个Stack 分别是UndoStack 和 RedoStack 分别来存储待撤销记录和待重做记录,假设这两个Stack的当前状态如下:
在这里插入图片描述
假设这个时候来个一个新的步骤Step4 ,这个时候Step4需要记录,记录的过程如下:

在这里插入图片描述
假设我现在需要撤销一步回到Step3,具体过程如下:
在这里插入图片描述

假设现在我又想重做上一步,想回到Step4,具体过程如下:
在这里插入图片描述
至此我们的记录、撤销、重做的核心逻辑就已经基本梳理清楚了,但是发现Record还有一个小问题,问题如下:
在这里插入图片描述
当我们RedoStack中存在数据时,如果记录新的步骤Step4,成功之后我们会发现,现在Undo会回到Step1,Redo会回到Step2,这样流程就乱了,所以,修改一个Record的逻辑,修改后如下:
在这里插入图片描述
有两种处理方案,方案一为每次记录新数步骤时清空RedoStack,方案二为每次记录新数据时将RedoStack中的数据尽数移动到UndoStack中,可根据需求选择。

由于我们选择的数据记录是记录影响显示和逻辑的所有数据 本身内存占用就比记录操作要大,如果再对这两个Stack的容量不做限制,就可能会浪费很多的内存,导致程序内存占用过高。所以我们需要对UndoStack和RedoStack做容量限制,超过容量时最早进入Stack的数据直接丢弃,但Stack本身是先进后出的数据结构,显然不能支持这种操作,所以权衡利弊之后,我选择将Stack改为LinkedList,具体的操作流程是一样的。

实现

下面直接展示源码:

using System.Collections.Generic;namespace S
{public interface IRecordData{}public class UndoManager{private LinkedList<IRecordData> undoLinkedList;private LinkedList<IRecordData> redoLinkedList;private IRecordData currentData;/// <summary>/// Undo数量/// </summary>public int undoCount => undoLinkedList == null ? 0 : undoLinkedList.Count;/// <summary>/// Redo数量/// </summary>public int redoCount => redoLinkedList == null ? 0 : redoLinkedList.Count;/// <summary>/// 记录的最大容量  <=0时 代表无限容量/// </summary>public int maxCount=0;public UndoManager(){undoLinkedList = new LinkedList<IRecordData>();redoLinkedList = new LinkedList<IRecordData>();currentData = null;}/// <summary>/// 重做一步/// </summary>/// <returns></returns>public IRecordData Redo(){if (currentData != null){undoLinkedList.AddLast(currentData);}if (redoLinkedList.Count == 0){currentData = null;}else{currentData = redoLinkedList.Last.Value;redoLinkedList.RemoveLast();}return currentData;}/// <summary>/// 撤销一步/// </summary>/// <returns></returns>public IRecordData Undo(){if (currentData != null){redoLinkedList.AddLast(currentData);}if (undoLinkedList.Count == 0){currentData = null;}else{currentData = undoLinkedList.Last.Value;undoLinkedList.RemoveLast();}return currentData;}/// <summary>/// 记录/// </summary>/// <param name="recordData">记录对象</param>/// <param name="overrideRedo">是否覆盖Redo链表</param>public void Record(IRecordData recordData,bool overrideRedo=true){if (currentData != null){undoLinkedList.AddLast(currentData);}if (overrideRedo){redoLinkedList.Clear();}else{while (redoLinkedList.Last != null){IRecordData value = redoLinkedList.Last.Value;redoLinkedList.RemoveLast();undoLinkedList.AddLast(value);}}currentData = recordData;if (maxCount>0&&undoCount > maxCount) //容量维护{undoLinkedList.RemoveFirst();}}/// <summary>/// 清空undo&redo/// </summary>public void Clear(){undoLinkedList.Clear();redoLinkedList.Clear();}}
}
http://www.yayakq.cn/news/368460/

相关文章:

  • 坂田网站建设费用明细装修123网
  • 网站运营和管理湘潭网站建设 问下磐石网络
  • 移动网站建站wap网站开发实例
  • 网站开发与解决技巧安居客二手房
  • 网站里自已的微信联系如何做廊坊网站建设方案开发
  • 鹤峰网站建设河南郑州网站建设哪家公司好
  • 成品网站10款全网vip影视网站一键搭建
  • 李沧网站建设公司做谐和年龄图的网站
  • 重庆建设教育培训管理系统网站高校门户网站的建设
  • 成都论坛网站建设做百度推广送的网站
  • 免费网站模板下载大全下载表情包制作在线
  • 网站备案幕布大小手机版网站制作费用
  • 做细胞激活的母液网站购物网站开发 项目描述
  • net网站建设多少前公司企业做网站怎么做
  • 服务 好的网站制作如何自己编写一个程序
  • 做网站怎么接单域名及网站建设实验报告
  • 网站地图 seo网页美工制作流程
  • 设计精美的国外网站上海上市装修公司
  • 单位网站备案济南网站建设培训学校
  • 监控企业网站模板好医生网站继续教育网
  • 深圳市住房和建设局网站变更网站ui界面设计软件
  • 有没有IT做兼职的网站做仿站如何获取网站源码
  • 企业网站cms模板网站开发技术发展
  • 南京市网站开发婚庆5个坑
  • wordpress整站主题app开发工具排行
  • 网站建设 市场规模网站开发是前端还是后台
  • 义乌网站建设联系方式小型企业网站建设报告模拟组建过程
  • 动态发布网站和静态发布网站17zwd一起做网站
  • 微信网页制作网站建设昆山广告制作公司
  • 给别人做网站是外包公司平安企业邮箱登录入口