作者: | 熊春雷 |
网站: | http://www.autodev.net |
Blog: | http://blog.csdn.net/pandaxcl |
EMail: | pandaxcl@163.com |
QQ: | 56637059 |
版本: | 0.01 于2007/09/25 |
目标: | 所有C++爱好者 |
版权: | 本文的版权归熊春雷所有 |
Warning
-
本文由熊春雷所写,绝对保证原创,在此特别严肃声明。
-
绝对不能容忍他人说本文为他所写以及其他的侵权行为。一旦发现,一定 尽本人最大的能力以法律的形式严追到底,决不妥协。
-
引用本文,要保证本文的完整性,不可以删除此处的声明,并且务必注明出处。
Tip
-
本文编写的所有代码可以用于任何用途(包括商业用途)。
-
用于商业用途的需要在最后发布的软件中声明借鉴了本文的思想。具体事 宜可以协商解决,(代码决不收取任何费用)。
-
其他事项可以和我联系,包括技术讨论等等:)或者直接登陆网站论坛: http://www.autodev.net
Note
-
本文受到了《C++设计新思维》和《产生式编程》两本书的影响,同时也查阅了大 量的资料,从Loki库和Boost库中也吸收了不少营养,特此感谢之。
-
本文由于处于原创阶段,难免会出现各种各样的错误。代码出现错误的可能性非常 小(本来想说为零的),因为文档和代码是严格同步的,这是由VST文本的include 所保证的,代码都是测试成功之后才发布的。
-
本文所编写的代码,经过了VC2005编译器和g++编译器的测试,并且都通过了。
-
本文还没有彻底完成,算是一个初级版本,未来还将继续完善。暂时发布出来是为 了预知读者群有多少,读者越多,我的成就感越强,写作的时候也会更有动力:)
-
本文还会继续完善,欢迎各位读者的批评指正,也接受各种各样的建议,在权衡之 后以决定是否加入本书。
-
本书还没有最终完成,还会不断的进行完善,更新之后的内容将会发表于我的 网站或我的博客。所以还需要读者多多关心本文的进展:)
Warning
-
本文的有效篇幅仅仅局限于基础篇,之后的文档还仅仅只是一种创意记录,
-
不保证正确性,特此提醒。
Contents
处理多类型的对象以及命令管理
目前为止,已经成功的将三个基本操作封装为三个基本命令,同时也将一个复合操作封装 成了一个复合命令,另外也给出了简单的使用代码;从代码中可以看出,撤销和重做的过 程还是比较晦涩,用户为了表达撤销和重做的过程还需要编写很多的额外代码,而且这种 代码也没有很直接的表达撤销和重做的思想。
最为重要的一点是:在上面的使用例子中,所有的命令是分散的,缺乏一个集中管理的地 方,从而导致了编码的繁琐和不规范!
为了更好的表达撤销和重做机制,并且更加简化客户端代码的书写,在此将会对前面给出 的代码进行更深入的封装,让客户端编写的代码尽可能的少,同时也能够更加直接的表达 撤销和重做的意思。
总的说来,在此要达到下列目标:
-
处理更多的对象类型,前面只是处理了一种类型(Object)。从本质上来说,处理 多个数据类型和处理一个数据类型是一样的,但是对于方便使用该撤销和重做框架 来说,给出一个示例将会是读者更加直接的了解到如何使用该框架的方便的实现自 己的撤销和重做能力。另外从方便使用的角度来说,本章中必须给出一个惯例,并 且在这个惯例的基础上,实现撤销和重做功能。实际上在本文中介绍的撤销和重做 框架还天生具备了序列化能力,这可是一个非常不错的副产品哦:)关于序列化的原 理,可以参见本人的其它相关文档。
-
撤销和重做过程在代码中表达得更加直观。从前面的示例代码中可以看出,撤销和 重做的功能虽然可以实现了,但是也要注意撤销和重做的表现并不直观,直接看到 代码,阅读代码的人并不能够很容易的了解代码的意义;所以,在此还要会改进这 种代码,使得阅读代码就像阅读文档一样,使代码更直接的表达撤销和重做的意义 。
-
实现任意次的撤销和重做。前面的撤销和重做次数默认是无限的,虽然默认的情况 下是无限次的撤销和重做,但是客户端有时候可能因为种种原因而不想使撤销和重 做的步骤太多,因而在此还要给出如何实现有限次的撤销和重做方案。
下面依次解决所提出的三个问题。对于问题(1)文中将会给出两个比较直接的数据类型:矩 形类(Rectangle)和圆形类(Circle)。对于问题(2)文中将会更进一步的封装前面的使用方 式,最后一个问题,文中将会给出一个使用惯例,是可以封装成为头文件的,这在后面讨 论。
有了上面的命令基类和复合操作类,要想使用撤销和重做功能,还需要 一个命令中心类 ,来集中管理各种命令,而这里的复合操作类已经具备了 一定的命令管理功能了,因此,命令中心类采用了复合操作类来实现:
class undo_bat:public batch{};// 撤销命令队列
class redo_bat:public batch{};// 重做命令队列
class center:public undo_bat,public redo_bat// 命令中心,管理两种命令队列
{
private:
size_t _limit;
public:
typedef redo_bat redo_type;
typedef undo_bat undo_type;
typedef undo_type history_type;
center():_limit(100)// 默认最大撤销操作步骤总数为100步,一般的应用已经足够
{
}
virtual~center()