您好,欢迎来到九壹网。
搜索
您的当前位置:首页有关一个Redo和Undo的一个框架

有关一个Redo和Undo的一个框架

来源:九壹网


有关一个Redo和Undo的一个框架

前不久看了 敏捷软件开发 原则、模式与实践,有点想法,所以就把我以前写得一个RedoUndo的框架改了一下,成了下面的情况。

我将操作RedoUndo的模块的接口了出来,这样在将来的扩展上就不会有太大的困难,并且将他与显示模块很大程度上避免了耦合。

在使用的时候可以有选择的使用RedoUndo的功能,如果某个工具需要RedoUndo的功能则直接继承与TransactionCommand即可。这样避免了冗余,在一些工具中不用承担一些不需要的永远不会用到的方法。

RedoUndo模块是使用标准的C++写的,为了测试这个模块我使用了Qt库,用于图形显示,这样产生了一个新的模块DrawTransaction。

1/***********************************************************************

2 * \\file TransactionCommand.h

3 * \\date 2008-07-06

4 * \\author HYin

5 **********************************************************************/

6

7#ifndef TRANSACTIONCOMMAND_H

8#define TRANSACTIONCOMMAND_H

9

10namespace hy

11{

12 class TransactionCommand

13 {

14 public :

15 TransactionCommand();

16 virtual ~TransactionCommand();

17

18 virtual bool redo() = 0;

19 virtual bool undo() = 0;

20

21 };

22}

23

24#endif

25

1/***********************************************************************

2* \\file RedoUndo.h

3* \\date 2008-07-06

4* \\author HYin

5**********************************************************************/

6

7#ifndef REDOUNDOTOOL_H

8#define REDOUNDOTOOL_H

9

10

// ---------------------------------------------------------------------------------------------------------------

11#include \"TransactionCommand.h\"

12#include

13

// ---------------------------------------------------------------------------------------------------------------

14

15namespace hy

16{

17 class TransactionCommand;

18

19 class RedoUndoTool : public TransactionCommand

20 {

21 typedef TransactionCommand Command;

22 public :

23 explicit RedoUndoTool( int depth = 10 );

24

25 void setDepth( int depth )

26 { m_iRedoUndoDepth = depth; }

27

28 void add( Command * command );

29

30 void clear()

31 { m_aCommandStack.clear(); }

32

33 virtual bool redo();

34 virtual bool undo();

35

36 private :

37 // depth for undo transaction

38 int m_iRedoUndoDepth;

39

40 // current step

41 int m_iCurrentStep;

42

43 // Command stack to store

44 std::vector< Command * > m_aCommandStack;

45

46 };

47

48}

49

50#endif

51

1/***********************************************************************

2* \\file RedoUndo.cpp

3* \\date 2008-07-06

4* \\author HYin

5**********************************************************************/

6

7

// ---------------------------------------------------------------------------------------------------------------

8#include \"RedoUndoTool.h\"

9#include

10#include

11using namespace std;

12

// ---------------------------------------------------------------------------------------------------------------

13

14

// ---------------------------------------------------------------------------------------------------------------

15#define hy_assert_error(str) { std::cerr << str << endl; assert(false); }

16#define hy_assert_warning(str) { std::cout << str << endl; }

17

// ---------------------------------------------------------------------------------------------------------------

18

19namespace hy

20{

21 RedoUndoTool::RedoUndoTool( int depth )

22 : m_iRedoUndoDepth(depth), m_iCurrentStep(-1)

23 {

24 m_aCommandStack.clear();

25 }

26

27 void RedoUndoTool::add( RedoUndoTool::Command * command )

28 {

29 int num = m_aCommandStack.size();

30

31 if ( m_iCurrentStep == num-1 || m_iCurrentStep == -1 )

32 {

33 m_aCommandStack.push_back(command);

34 m_iCurrentStep ++;

35 }

36 else if ( m_iCurrentStep < num-1 )

37 {

38 m_aCommandStack.erase(

39 m_aCommandStack.begin()+m_iCurrentStep+1, m_aCommandStack.end()

40 );

41 m_aCommandStack.push_back(command);

42 m_iCurrentStep ++;

43 }

44 else

45 {

46 hy_assert_error( \" error : RedoUndoTool::add( const RedoUndoTool::Command & command ) :\"

47 << \" invalid m_iCurrentStep\" );

48 }

49

50 // keep the depth

51 num = m_aCommandStack.size();

52 if ( num > m_iRedoUndoDepth )

53 {

54 m_aCommandStack.erase( m_aCommandStack.begin(),

55 m_aCommandStack.begin()+num-m_iRedoUndoDepth );

56 m_iCurrentStep = m_iRedoUndoDepth-1;

57 }

58 }

59

60 bool RedoUndoTool::redo()

61 {

62 int num = m_aCommandStack.size();

63 if ( m_iCurrentStep == num-1 )

{

65 hy_assert_warning(\" warning : RedoUndoTool::redo() :\"

66 << \" out of range: default to return directively!! \" );

67 }

68 else if ( m_iCurrentStep < num-1 && m_iCurrentStep >= -1 )

69 {

70 return m_aCommandStack[++m_iCurrentStep]->redo();

71 }

72 else

73 {

74 hy_assert_error(\" error : RedoUndoTool::redo() :\"

75 << \" invalid m_iCurrentStep\" );

76 }

77 return false;

78 }

79

80 bool RedoUndoTool::undo()

81 {

82 int num = m_aCommandStack.size();

83 if ( m_iCurrentStep == -1 )

84 {

85 hy_assert_warning(\" warning : RedoUndoTool::undo() :\"

86 << \" out of range: default to return directively!! \" );

87 }

88 else if ( m_iCurrentStep <= num-1 && m_iCurrentStep > -1 )

{

90 return m_aCommandStack[m_iCurrentStep--]->undo();

91 }

92 else

93 {

94 hy_assert_error(\" error : RedoUndoTool::undo() :\"

95 << \" invalid m_iCurrentStep\" );

96 }

97 return false;

98 }

99

100}

101

这是显示模块,在这里只显示接口

1/***********************************************************************

2* \\file DrawTransaction.h

3* \\date 2008-07-07

4* \\author HYin

5**********************************************************************/

6

7#ifndef DRAWTRANSACTION_H

8#define DRAWTRANSACTION_H

9

10

// ---------------------------------------------------------------------------------------------------------------

11

// ---------------------------------------------------------------------------------------------------------------

12

13namespace hy

14{

15 class DrawTransaction

16 {

17 public :

18 DrawTransaction();

19 virtual ~DrawTransaction();

20

21 virtual void draw() =0;

22 };

23}

24

25#endif

26

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务