您的位置:首页 > 其它

Undo/Redo几种实现方式介绍(四)——command模式实现

2017-11-12 19:57 471 查看
前一篇介绍的方式是对每一个可能导致undo/redo的操作进行记录,保存操作前后的数据以及一些辅助信息,然后集中在一起对这些操作进行处理。而command模式实际上就是将集中处理拆开,也就是把每一个操作都看做是是一个独立的对象(而不仅仅是做一个记录),在这个对象中保存操作前后的数据和辅助信息。 它比前一种保存操作的方法好的地方是:1)不需要定义一个统一的操作描述类以适应所有操作,而是为每一个操作都定义了一个类,在这个类中可以任意记录所需要的内容,不会影响到其它操作;2)将每个操作对应的undo/redo都放在这个操作对应的类中,而不是集中处理,这样使得操作与操作之间不会相互影响,对一个操作的undo/redo的修改只是发生在这个操作对应的类中;3)不需要定义操作枚举和目标对象枚举,提高了程序的可扩展性,每个操作对应的类都保存必要的信息来完成 undo/redo,而程序的其他部分不需要关心这个类操作的哪些内容。 虽然command模式的关键代码与上一篇的程序的代码没有太多区别,但是每个操作都对应一个类后使得程序的灵活性与可扩展性都提高了不少。 关于command模式的介绍很多,可以到网上去搜索。这里仅说一下是怎么实现command模式的。 所有操作对应的类都继承于ICommand接口,这个接口有三个函数,除了必须的Undo(),Redo()函数,还定义了一个Execute()函数用于执行用户正常的操作,只有这个操作执行成功才会记录下这个操作。

  所有的操作都保存在CommandBox类中,这个类可以用单件模式包装一下,也可以在窗口类型定义一个私有变量。这个类中提供了窗口类所有需要的内容,比如查询是否可以undo(用CanUndo属性)、是否可以redo(用CanRedo属性),添加操作类对象等等。

具体的内容可以参考项目源代码,项目代码的地址如下,项目名称是UndoRedoVersion3st。 https://skydrive.live.com/?cid=423921156EB9AD66&id=423921156EB9AD66%21105#cid=423921156EB9AD66&id=423921156EB9AD66%21112
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: