• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Forever

            my feeling and C++'s
            posts - 5, comments - 12, trackbacks - 0, articles - 0

            有關一個Redo和Undo的一個框架

            Posted on 2008-07-08 15:00 HYin 閱讀(2542) 評論(5)  編輯 收藏 引用
            前不久看了 敏捷軟件開發 原則、模式與實踐,有點想法,所以就把我以前寫得一個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 <vector>
            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 <iostream>
             10#include <assert.h>
             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 )
             64        {
             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 )
             89        {
             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

            Feedback

            # re: 有關一個Redo和Undo的一個框架  回復  更多評論   

            2008-07-09 09:22 by cexer
            不錯,學習了!

            # re: 有關一個Redo和Undo的一個框架[未登錄]  回復  更多評論   

            2008-07-09 16:46 by NAME
            http://topic.csdn.net/u/20080709/16/7e145829-588c-4962-9a95-bd784becb120.html

            # re: 有關一個Redo和Undo的一個框架  回復  更多評論   

            2008-07-10 23:02 by 夢在天涯
            好東東!超有用啊!

            如果更模塊化下會更好啊,以后讓大家都可以用哦!

            # re: 有關一個Redo和Undo的一個框架  回復  更多評論   

            2008-07-12 22:11 by HYin
            @夢在天涯
            前一個我是用模板做的,不是很好,邏輯上有問題

            # re: 有關一個Redo和Undo的一個框架  回復  更多評論   

            2008-07-12 23:37 by 萬連文
            微軟有個Undo接口,按照這個接口實現應該好一些,畢竟經過實踐了的。
            久久久青草青青亚洲国产免观| 久久久一本精品99久久精品88 | 热综合一本伊人久久精品 | 国产午夜精品久久久久九九| 精品久久人人做人人爽综合| 国产精品久久久久a影院| 久久夜色精品国产网站| 99久久99久久精品国产片| 欧美亚洲日本久久精品| 久久婷婷五月综合色奶水99啪| 91久久精品电影| 看久久久久久a级毛片| 久久久久国产成人精品亚洲午夜| 无码伊人66久久大杳蕉网站谷歌| 亚洲国产成人久久综合一| 国内精品久久久久影院亚洲| 久久精品一区二区| 亚洲精品无码久久久久去q | 天天爽天天狠久久久综合麻豆| 国产精品美女久久久久av爽 | 国色天香久久久久久久小说 | 久久一区二区三区99| 精品无码久久久久国产| 久久91精品国产91| 国产午夜福利精品久久| 精品久久久久香蕉网| 蜜桃麻豆www久久国产精品| 久久亚洲AV成人无码电影| 中文国产成人精品久久不卡| 久久久久亚洲精品日久生情| 999久久久无码国产精品| 日本精品久久久久中文字幕8 | 一级做a爰片久久毛片看看| 亚洲精品无码久久久久去q| 品成人欧美大片久久国产欧美| 久久无码高潮喷水| 99久久99久久精品国产片果冻| 国产99久久久国产精品小说| 青青青青久久精品国产h| 亚洲级αV无码毛片久久精品| 久久这里只有精品久久|