欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中通過Command模式實現(xiàn)Redo/Undo方案

 更新時間:2022年06月17日 14:38:31   作者:天方  
這篇文章介紹了C#中通過Command模式實現(xiàn)Redo/Undo方案的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一個比較常見的改進用戶體驗的方案是用Redo/Undo來取代確認(rèn)對話框,由于這個功能比較常用,本文簡單的給了一個在C#中通過Command模式實現(xiàn)Redo/Undo方案的例子,以供后續(xù)查詢。

class Program
{
    static void Main(string[] args)
    {
        var cmds = new CommandManager();
        while (true)
        {
            var key = Console.ReadKey(true);
            if (key.KeyChar >= '0' && key.KeyChar <= '9')
            {
                cmds.DoNewCommand(key.KeyChar.ToString(), () => Console.WriteLine("process " + key.KeyChar), () => Console.WriteLine("redo " + key.KeyChar));
            }
            else
            {
                if (key.Modifiers.HasFlag(ConsoleModifiers.Control) && (key.Key == ConsoleKey.Z))
                    cmds.UnDo();
                else if (key.Modifiers.HasFlag(ConsoleModifiers.Control) && (key.Key == ConsoleKey.Y))
                    cmds.ReDo();
            }
        }
    }
}

class CommandManager
{
    #region Command定義
    public class Command
    {
        string name;
        Action action;
        Action unDoAction;

        internal Command(string name, Action action, Action unDoAction)
        {
            this.name = name;
            this.action = action;
            this.unDoAction = unDoAction;
        }

        internal void Do() { action(); }
        internal void UnDo() { unDoAction(); }

        public override string ToString()
        {
            return name.ToString();
        }
    }
    #endregion

    public Stack<Command> ReDoActionStack { get; private set; }
    public Stack<Command> UnDoActionStack { get; private set; }

    public CommandManager()
    {
        ReDoActionStack = new Stack<Command>();
        UnDoActionStack = new Stack<Command>();
    }

    public void DoNewCommand(string name, Action action, Action unDoAction)
    {
        var cmd = new Command(name, action, unDoAction);
        UnDoActionStack.Push(cmd);
        ReDoActionStack.Clear();
        cmd.Do();
    }

    public void UnDo()
    {
        if (!CanUnDo)
            return;

        var cmd = UnDoActionStack.Pop();
        ReDoActionStack.Push(cmd);
        cmd.UnDo();
    }

    public void ReDo()
    {
        if (!CanReDo)
            return;

        var cmd = ReDoActionStack.Pop();
        UnDoActionStack.Push(cmd);
        cmd.Do();
    }

    public bool CanUnDo { get { return UnDoActionStack.Count != 0; } }
    public bool CanReDo { get { return ReDoActionStack.Count != 0; } }
    //public IEnumerable<Command> Actions { get { return ReDoActionStack.Reverse().Concat(UnDoActionStack); } }
}

原理很簡單,通過Command模式把每一步操作封裝成一個可undo的命令(包含do和redo兩個操作)。并將每一步操作執(zhí)行后用棧保存起來,undo的時候就以此將Command依次出棧,并執(zhí)行undo操作。(從某種意義上來說,redo就是undo操作的undo)

上面的代碼已經(jīng)實現(xiàn)了基本的Undo/Redo功能,但實際使用的時候還是有一些細(xì)節(jié)需要考慮的:如undo或redo時失?。⊕伄惓#┑奶幚淼取S捎谶@些細(xì)節(jié)方面的處理方式不盡相同,本文只是實現(xiàn)一個基本框架,以備后續(xù)使用時參考,并不想把它弄的過于復(fù)雜。

這種方式比較簡單,幾乎每種語言都可以輕易的寫出這種方式下的實現(xiàn)。但通過這種Command封裝的方式實現(xiàn)的也有一些限制,使用的時候需要注意:

  • 每一步操作都需要封裝成command命令
  • 每一步操作都是可逆的
  • 當(dāng)命令過多的時候需要考慮commandlist的內(nèi)存占用和命令查詢時的性能問題

到此這篇關(guān)于C#中通過Command模式實現(xiàn)Redo/Undo方案的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Unity實現(xiàn)3D版2048游戲的示例代碼

    基于Unity實現(xiàn)3D版2048游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Unity實現(xiàn)簡易的3D版2048游戲,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的可以參考一下
    2023-02-02
  • C#的String和StringBuilder詳解

    C#的String和StringBuilder詳解

    這篇文章主要介紹了C#的String和StringBuilder詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C#獲取存儲過程返回值和輸出參數(shù)值的方法

    C#獲取存儲過程返回值和輸出參數(shù)值的方法

    這篇文章主要介紹了C#獲取存儲過程返回值和輸出參數(shù)值的方法,有需要的朋友可以參考一下
    2014-01-01
  • c#讀取文件詳談

    c#讀取文件詳談

    你平時是怎么讀取文件的?使用流讀取。是的沒錯,C#給我們提供了非常強大的類庫(又一次吹捧了.NET一番)
    2013-09-09
  • c#操作iis根目錄的方法

    c#操作iis根目錄的方法

    這篇文章主要介紹了c#操作iis根目錄的方法,涉及C#針對IIS下目錄的相關(guān)操作技巧,需要的朋友可以參考下
    2015-06-06
  • C#單位轉(zhuǎn)換器簡單案例

    C#單位轉(zhuǎn)換器簡單案例

    這篇文章主要為大家詳細(xì)介紹了C#單位轉(zhuǎn)換器簡單案例,一個簡單的winform應(yīng)用程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • C#使用NUnit進行單元測試詳解

    C#使用NUnit進行單元測試詳解

    NUnit是一個開源的.Net單元測試框架,經(jīng)常被用來在.Net體系下做白盒測試,本文主要為大家詳細(xì)介紹了如何C#如何使用NUnit進行單元測試,感興趣的可以了解下
    2023-12-12
  • C#操作IIS方法集合

    C#操作IIS方法集合

    這篇文章主要介紹了C#操作IIS方法集合的相關(guān)資料,需要的朋友可以參考下
    2015-09-09
  • C# 三種方式實現(xiàn)Socket數(shù)據(jù)接收

    C# 三種方式實現(xiàn)Socket數(shù)據(jù)接收

    這篇文章主要給大家分享三種實現(xiàn)C# 實現(xiàn)Socket數(shù)據(jù)接收的方式,接下倆小編就來為大家詳細(xì)介紹吧,需要的朋友可以參考一下
    2021-10-10
  • C#中實現(xiàn)向數(shù)組中動態(tài)添加元素

    C#中實現(xiàn)向數(shù)組中動態(tài)添加元素

    這篇文章主要介紹了C#中實現(xiàn)向數(shù)組中動態(tài)添加元素方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評論