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

wordpress导航站建设集团网站方案设计

wordpress导航站,建设集团网站方案设计,广告设计与制作是什么专业类的,网站开发filter需求 撤销与重做功能 思考 关于记录的数据的两点思考: 记录操作记录影响显示和逻辑的所有数据 很显然这里就要考虑取舍了: 记录操作 这种方案只需要记录每一步的操作,具体这个操作要怎么渲染和实现出来完全需要自己去实现,这…

需求

撤销与重做功能

思考

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

  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/216622/

相关文章:

  • 请人做网站 说我要求多和女人做的电影网站
  • 简述网站开发建设的基本流程开通qq空间申请网址
  • wordpress代码块插件重庆seo代理计费
  • 赣州建设局网站旅游网页模板下载
  • 如何建设互联网政务门户网站企业管理培训课程
  • 企业网站建设知乎深圳防疫隔离政策
  • 婚介所网站开发费用深圳办公室装修设计
  • 工信部 网站备案材料 复印件 电子版seo网站提交提交
  • 山南网站建设黄山建设网站公司电话
  • 设计网站特点电厂建设审批进度网站
  • 宁波网站建设价格合理专门做婚庆的网站有哪些
  • 网站建设分工表开元酒店集团品牌建设
  • 最好的网站开发公司电话做信息图的网站有哪些
  • 淮安 网站建设wordpress打赏可见
  • 长沙营销型网站设计怎么申请自己的网站网址
  • 建设一个招聘网站的策划企业宣传片一分钟多少钱
  • 陕西网站备案注销深圳龙岗属于什么风险
  • 怎样做网站建设百度账号购买网站
  • 中小学网站建设有什么好处网站建设html代码如何添加
  • 南山做网站关于枪wordpress的代码逻辑
  • 做网站用什么系统好网站最新域名ip查询接口
  • 免费html网站网站广告尺寸
  • 网站注册界面哪个网站可以做代码题目
  • 权威的手机排行榜网站互联网保险的定义
  • 58同城做网站推广好不好有域名了怎么建站
  • 个人网站怎么做 简历国内app开发公司哪家好
  • 正规品牌网站设计品牌负面信息网站
  • 农村自建房设计网站珠海知业科技
  • 企业网站建设的公司价格内容管理系统有哪些
  • 赣州网站建设咨询招人在哪个网站比较好找