午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

撤銷與反撤銷 功能實現(xiàn)

 yuxinrong 2018-12-02

撤銷與反撤銷 功能實現(xiàn)

    
    它們就表示“撤銷”與“反撤銷”。在程序中,這種功能通常是使用Command模式實現(xiàn)的,本文也不例外。首先抽象定義Command,使用ICommand接口:
    public interface ICommand
    {
        
void Excute() ;
    }
    Excute表示執(zhí)行該ICommand引用的目標(biāo)的所包含的動作(或動作序列)。
    
    可撤銷的命令也是一種命令,所以從ICommand繼承:
    
    public interface IBackableCommand :ICommand
    {
        
void Undo() ;
    }
    一個可撤銷的命令表明調(diào)用其Excute方法后,再調(diào)用其Undo方法可以使被操作的對象回復(fù)到之前的狀態(tài)。

    為了實現(xiàn)撤銷功能,我們需要一個堆棧來記錄所有已執(zhí)行的可撤銷命令,為了實現(xiàn)反撤銷的功能,同樣,我們也需要一個堆棧來記錄所有已撤銷的命令。這個職責(zé)是由ICommandManager接口提供:
    
    public interface ICommandManager
    {
        
void ExcuteCommand(ICommand command) ;
        
void Undo() ;
        
void ReverseUndo() ;//反撤銷

        
//以下事件可用于控制撤銷與反撤銷圖標(biāo)的啟用
        event CbSimpleBool UndoStateChanged ; //bool參數(shù)表明當(dāng)前是否有可撤銷的操作
        event CbSimpleBool ReverseUndoStateChanged ; //bool參數(shù)表明當(dāng)前是否有可反撤銷的操作
    }

    現(xiàn)在,我們來詳細(xì)分析一下,撤銷命令堆棧和反撤銷命令堆棧在何時Push命令對象、又在何時Pop命令對象:
(1)當(dāng)執(zhí)行完任何一個command后,reverseUndo堆棧清空
(2)當(dāng)執(zhí)行完一個不可撤銷的command后,undo堆棧清空
(3)當(dāng)執(zhí)行完一個可撤銷的command后,將其壓入undo堆棧
(4)當(dāng)撤銷一個command后,將其轉(zhuǎn)移到reverseUndo堆棧

    基于此,我們就可以實現(xiàn)ICommandManager:
    public class CommandManager :ICommandManager
    {
        
private Stack undoStack    = new Stack() ;
        
private Stack reverseStack = new Stack() ;

        
public event CbSimpleBool UndoStateChanged ; 
        
public event CbSimpleBool ReverseUndoStateChanged ; 

        
public CommandManager()
        {
            
this.UndoStateChanged         += new CbSimpleBool(CommandManager_UndoStateChanged);
            
this.ReverseUndoStateChanged += new CbSimpleBool(CommandManager_UndoStateChanged) ;
        }

        
private void CommandManager_UndoStateChanged(bool val)
        {

        }

        
#region ICommandManager 成員

        
public void ExcuteCommand(ICommand command)
        {
            command.Excute() ;
            
this.reverseStack.Clear() ;

            
if(command is IBackableCommand)
            {
                
this.undoStack.Push(command) ;
            }
            
else
            {
                
this.undoStack.Clear() ;
            }

            
this.UndoStateChanged(this.undoStack.Count > 0) ;
        }

        
public void Undo()
        {
            IBackableCommand command 
= (IBackableCommand)this.undoStack.Pop() ;
            
if(command == null)
            {
                
return ;
            }

            command.Undo() ;
            
this.reverseStack.Push(command) ;

            
this.ReverseUndoStateChanged(this.reverseStack.Count > 0) ;
        }

        
public void ReverseUndo()
        {
            IBackableCommand command 
= (IBackableCommand)this.reverseStack.Pop() ;
            
if(command == null)
            {
                
return ;
            }

            command.Excute() ;
            
this.undoStack.Push(command) ;

            
this.UndoStateChanged(this.undoStack.Count > 0) ;
            
this.ReverseUndoStateChanged(this.reverseStack.Count > 0) ;
        }
        
#endregion        
    }

    本文介紹的撤銷與反撤銷功能是與應(yīng)用無關(guān)的,所以可以在不同的應(yīng)用中復(fù)用,你只需要根據(jù)你自己的應(yīng)用需求來實現(xiàn)對應(yīng)的ICommand接口和IBackableCommand接口就可以立即使用撤銷與反撤銷功能了。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多