采用设计模式中的“命令模式”实现 C1FlexGrid 的撤销还原功能,那就先从命令模式简单介绍开始吧。

一  命令模式

命令模式属于对象的行为型模式,将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销还原的操作。

[C1] 实现 C1FlexGrid 撤销还原功能

采用命令模式,把发出命令的责任和执行命令的责任分隔开,委派给不同的对象。

ICommand 是命令的接口,指定所有命令必须实现两个方法 Execute(执行,还原)和 Undo(撤销);

ConcreteCommand 作为具体命令的实现,诸如增加/删除行/列命令,调整行/列命令,编辑命令等等;

Invoker 作为命令调用者,可以理解为命令集管理类,负责命令的调用以及命令集合管理等操作;

Receiver 是命令的接收者,是命令的真正执行者,在本文的实现里,可以理解为 C1FlexGrid

Client 则负责创建具体命令对象,并确定其接收者,这个 Client 可以是任何一个地方,只要那里需要执行某个命令;

命令模式具体讲解参考博客 savilleEdward_jie,楼主就不班门弄斧了。

理论毕竟是理论,还是要靠实践来检验,而且要根据实际情况灵活变通才是王道。于是楼主把它用到 C1FlexGrid 里玩玩看。

二  C1FlexGrid 撤销还原模块设计实现

模块设计图如下,楼主不擅长画什么 UML 活动图类图什么的,就画个大概意思吧。

[C1] 实现 C1FlexGrid 撤销还原功能

先从一个单元格编辑命令 EditAction 开始吧。

IUndoableAction 相当于上面所讲的 ICommand 接口,这里楼主把里面的方法换成了 Undo 和 Redo,依次对应前面的 Undo 和 Execute,还有一个方法是 SaveNewState,是用于在命令第一次执行后,保存命令执行后的新状态,以便于还原;(说明一点的是,旧状态会在命令初始化时进行备份;而新状态则是通过调用 SaveNewState 方法来备份);

namespace Memento.SLFlexGrid.UndoStack
{
    /// <summary>
    /// 定义实现可撤销动作对象所需要的方法
    /// </summary>
    public interface IUndoableActio
    {
        /// <summary>
        /// 撤销
        /// </summary>
        void Undo()

        /// <summary>
        /// 还原
        /// </summary>
        void Redo()

        /// <summary>
        /// 动作执行后保存状态
        /// </summary>
        bool SaveNewState()
    }
}
IUndoableAction

相关文章: