• <tfoot id="ukgsw"><input id="ukgsw"></input></tfoot>
    
    • 久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
      分享

      輕松實(shí)現(xiàn)記錄與撤銷——C#中的Command模式

       小世界的野孩子 2021-07-18

      Command模式屬于行為模式,作為大名鼎鼎的23個(gè)設(shè)計(jì)模式之一,Command模式理解起來(lái)不如工廠模式,單例模式等那么簡(jiǎn)單直白。究其原因,行為模式著重于使用,如果沒(méi)有編程實(shí)踐,確實(shí)不如創(chuàng)造模式那么直白。我們先看看UML類圖。

      估計(jì)很多同學(xué)看著圖就暈了,那么多東西,Command和Concrete Command還好理解,那些Receiver和Invoker又是什么東西呢?
       
      別著急,只要理解了一點(diǎn),這個(gè)模式就很容易理解了,下面劃重點(diǎn),Command模式最主要的特點(diǎn),是將命令封裝成類,在類中保存命令執(zhí)行的上下文(即該命令執(zhí)行的參數(shù),執(zhí)行的對(duì)象),以實(shí)現(xiàn)命令執(zhí)行對(duì)象和命令發(fā)出對(duì)象的解耦
       
      這樣一來(lái)是不是覺(jué)得好理解多了?Command類里面的Receiver,就是命令具體執(zhí)行的對(duì)象。這里的Client可以理解為裝配環(huán)境,在這里面代碼實(shí)例化Command。Invoker內(nèi)部保存命令(可以保存多條命令,實(shí)現(xiàn)命令記錄查看,撤銷等),客戶端代碼通過(guò)Invoker來(lái)操作命令。接下來(lái)我們看看示例代碼。

       

      定義Command接口

      首先我們定義一個(gè)支持撤銷的Command接口。

          interface Command
          {
              void Execute();
              void Undo();
          }
      

      定義Receiver

      接下來(lái)我們定義Receiver,也就是命令的執(zhí)行對(duì)象,這里我們定義一個(gè)Ball類。

          class Ball
          {
              public int Size { get; set; } = 10;
              public string Name { get; set; } = "My First Ball";
              public void Inspect()
              {
                  Console.WriteLine("My Name is {0} and size is {1}", Name, Size);
              }
          }
      

      定義具體命令

      這里定義兩個(gè)命令,一個(gè)修改名字,一個(gè)修改大小。

          class ChangeNameCommand : Command
          {
              private Ball _Ball;
              private string _OldName;
              public string NameYouWant { get; set; }
              public ChangeNameCommand(Ball ball)
              {
                  _Ball = ball;
              }
      
              public void Execute()
              {
                  _OldName = _Ball.Name;
                  _Ball.Name = NameYouWant;
              }
      
              public void Undo()
              {
                  _Ball.Name = _OldName;
              }
          }
          
      class ChangeSizeCommand : Command
      {
      //代碼大同小異,略
      }
      

      定義Invoker

      接下來(lái)是Invoker,,也就是存儲(chǔ)命令,并最終會(huì)被用戶代碼調(diào)用的類,這里我們叫它CommandManager。

          class CommandManager
          {
              private Stack<Command> commands = new Stack<Command>();
      
              public void RunCommand(Command command)
              {
                  command.Execute();
                  commands.Push(command);
              }
      
              public void Undo()
              {
                  if (commands.Count > 0)
                  {
                      var command = commands.Pop();
                      command.Undo();
                  }
              }
              
      public void ShowCommands()
              {
                  var temp = commands.Reverse();
                  foreach(var command in temp)
                  {
                      //display command
                  }
              }
          }
      

      使用命令

      現(xiàn)在我們看看客戶端代碼是怎么使用他們的,定義Ball,定義命令,通過(guò)CommandManager去調(diào)用,這樣可以方便查看命令記錄,撤銷命令,等。

              static void Main(string[] args)
              {
                  Ball ball = new Ball();
                  ball.Inspect();
      
                  ChangeNameCommand changeName = new ChangeNameCommand(ball) { NameYouWant = "Changed" };
                  ChangeSizeCommand changeSize = new ChangeSizeCommand(ball) { SizeYouWant = 20 };
      
                  CommandManager manager = new CommandManager();
                  manager.RunCommand(changeName);
                  manager.RunCommand(changeSize);
                  ball.Inspect();
      
      manager.ShowCommands();
                  
                  manager.Undo();
                  ball.Inspect();
      
                  manager.Undo();
                  ball.Inspect();            
              }
      

      就醬,我們已經(jīng)實(shí)現(xiàn)了命令模式,并且還支持命令的記錄與撤銷,希望能對(duì)大家有點(diǎn)幫助。

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

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多

        主站蜘蛛池模板: 久久综合九色综合97欧美| 久久亚洲道色宗和久久| 亚洲国产成人精品福利无码| 国产精品毛片一区二区 | A级国产乱理伦片在线播放| 各种少妇wbb撒尿| 国产成人无码免费网站| 亚洲AV无码一区二区乱子伦 | 疯狂做受XXXX高潮国产| 色欲色香天天天综合网WWW| 日本高清一区免费中文视频| A级国产乱理伦片在线播放| 国产99视频精品免费视频36| 人人妻人人添人人爽欧美一区 | 野花社区视频在线观看| 亚洲AV成人片不卡无码| 国产精品情侣呻吟对白视频| 久久香蕉国产线看观看怡红院妓院| 人人爽人人片人人片AV| 国产成人综合95精品视频| 日本欧美一区二区三区在线播放| 日韩AV高清在线看片| 国产一区二区一卡二卡| 久久男人AV资源网站| 在线看无码的免费网站| 欧美性猛交xxxx乱大交丰满| 国产精品无码无需播放器| 欧洲精品色在线观看| av午夜福利一片免费看久久| 伊人色综合久久天天小片| 精品人妻中文字幕在线| 日韩精品一区二区亚洲AV| 99精品国产一区二区电影| 国产精品免费视频不卡| 亚洲国产精品无码久久98| 久久亚洲精品情侣| 疯狂做受XXXX高潮国产| 国产午夜影视大全免费观看| 国产精品日本一区二区在线播放| 午夜在线观看免费观看 视频| 国产日韩一区二区四季|