• <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
            前不久看了 敏捷軟件開發(fā) 原則、模式與實(shí)踐,有點(diǎn)想法,所以就把我以前寫得一個(gè)RedoUndo的框架改了一下,成了下面的情況。
            我將操作RedoUndo的模塊的接口獨(dú)立了出來,這樣在將來的擴(kuò)展上就不會有太大的困難,并且將他獨(dú)立與顯示模塊很大程度上避免了耦合。
            在使用的時(shí)候可以有選擇的使用RedoUndo的功能,如果某個(gè)工具需要RedoUndo的功能則直接繼承與TransactionCommand即可。這樣避免了冗余,在一些工具中不用承擔(dān)一些不需要的永遠(yuǎn)不會用到的方法。

            RedoUndo模塊是使用標(biāo)準(zhǔn)的C++寫的,為了測試這個(gè)模塊我使用了Qt庫,用于圖形顯示,這樣產(chǎn)生了一個(gè)新的模塊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: 有關(guān)一個(gè)Redo和Undo的一個(gè)框架  回復(fù)  更多評論   

            2008-07-09 09:22 by cexer
            不錯(cuò),學(xué)習(xí)了!

            # re: 有關(guān)一個(gè)Redo和Undo的一個(gè)框架[未登錄]  回復(fù)  更多評論   

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

            # re: 有關(guān)一個(gè)Redo和Undo的一個(gè)框架  回復(fù)  更多評論   

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

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

            # re: 有關(guān)一個(gè)Redo和Undo的一個(gè)框架  回復(fù)  更多評論   

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

            # re: 有關(guān)一個(gè)Redo和Undo的一個(gè)框架  回復(fù)  更多評論   

            2008-07-12 23:37 by 萬連文
            微軟有個(gè)Undo接口,按照這個(gè)接口實(shí)現(xiàn)應(yīng)該好一些,畢竟經(jīng)過實(shí)踐了的。

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            欧美激情精品久久久久久久九九九| 久久男人Av资源网站无码软件| 国内精品久久久久久久影视麻豆| 国产91久久综合| 国产69精品久久久久APP下载| 日韩人妻无码精品久久久不卡| a高清免费毛片久久| 久久无码人妻精品一区二区三区| 婷婷综合久久中文字幕蜜桃三电影| 国内精品九九久久久精品| 久久国产成人亚洲精品影院| 久久综合亚洲色一区二区三区| 国产一久久香蕉国产线看观看| 久久综合鬼色88久久精品综合自在自线噜噜| 一级做a爰片久久毛片毛片| 久久se精品一区二区| 中文字幕无码av激情不卡久久| 国产一级做a爰片久久毛片| 欧美黑人激情性久久| 精品久久久无码中文字幕| 亚洲中文字幕久久精品无码APP| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 欧美伊人久久大香线蕉综合69| 久久精品人人槡人妻人人玩AV| 国产精品成人久久久| 久久久91人妻无码精品蜜桃HD| 国产精品久久免费| 狠狠色丁香久久婷婷综合五月| 亚洲精品tv久久久久久久久 | 777午夜精品久久av蜜臀| 超级碰久久免费公开视频| 韩国三级大全久久网站| 久久精品国产亚洲av日韩| 久久久亚洲欧洲日产国码二区| 亚洲乱码精品久久久久..| 欧美日韩精品久久免费| 久久狠狠爱亚洲综合影院| 影音先锋女人AV鲁色资源网久久| 狠狠色丁香婷婷久久综合| 久久精品中文无码资源站| 久久人人添人人爽添人人片牛牛|