亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# 設計模式系列教程-命令模式

2020-01-24 01:08:43
字體:
來源:轉載
供稿:網友

1. 概述

  將一個請求封裝為一個對象(即我們創建的Command對象),從而使你可用不同的請求對客戶進行參數化; 對請求排隊或記錄請求日志,以及支持可撤銷的操作。

2. 解決的問題

  在軟件系統中,行為請求者與行為實現者通常是一種緊耦合的關系,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵御變化的緊耦合的設計就不太合適。

3. 模式中角色

  3.1 抽象命令(Command):定義命令的接口,聲明執行的方法。

  3.2 具體命令(ConcreteCommand):具體命令,實現要執行的方法,它通常是“虛”的實現;通常會有接收者,并調用接收者的功能來完成命令要執行的操作。

  3.3 接收者(Receiver):真正執行命令的對象。任何類都可能成為一個接收者,只要能實現命令要求實現的相應功能。

  3.4 調用者(Invoker):要求命令對象執行請求,通常會持有命令對象,可以持有很多的命令對象。這個是客戶端真正觸發命令并要求命令執行相應操作的地方,也就是說相當于使用命令對象的入口。

  3.5 客戶端(Client):命令由客戶端來創建,并設置命令的接收者。

4. 模式解讀

  4.1 命令模式的類圖

http://files.VeVB.COm/file_images/article/201606/201606011014469.png

  4.2 命令模式的實現代碼

 /// <summary> /// 接收者類,知道如何實施與執行一個請求相關的操作,任何類都可能作為一個接收者。 /// </summary> public class Receiver {  /// <summary>  /// 真正的命令實現  /// </summary>  public void Action()  {   Console.WriteLine("Execute request!");  } } /// <summary> /// 抽象命令類,用來聲明執行操作的接口 /// </summary> public interface ICommand {  void Execute(); } /// <summary> /// 具體命令類,實現具體命令。 /// </summary> public class ConcereteCommand : ICommand {  // 具體命令類包含有一個接收者,將這個接收者對象綁定于一個動作  private Receiver receiver;  public ConcereteCommand(Receiver receiver)  {   this.receiver = receiver;  }  /// <summary>  /// 說這個實現是“虛”的,因為它是通過調用接收者相應的操作來實現Execute的  /// </summary>  public void Execute()  {   receiver.Action();  } } /// <summary> /// 調度類,要求該命令執行這個請求 /// </summary> public class Invoker {  private ICommand command;  /// <summary>  /// 設置命令  /// </summary>  /// <param name="command"></param>  public void SetCommand(ICommand command)  {   this.command = command;  }  /// <summary>  /// 執行命令  /// </summary>  public void ExecuteCommand()  {   command.Execute();  } }

  4.3 客戶端代碼

 class Program {  static void Main(string[] args)  {   Receiver receiver = new Receiver();   ICommand command = new ConcereteCommand(receiver);   Invoker invoker = new Invoker();   invoker.SetCommand(command);   invoker.ExecuteCommand();   Console.Read();  } }

  執行結果

http://files.VeVB.COm/file_images/article/201606/2016060110144610.png

  4.4 模式分析

    4.4.1 本質:對命令進行封裝,將發出命令與執行命令的責任分開。

    4.4.2 每一個命令都是一個操作:請求的一方發出請求,要求執行一個操作;接收的一方收到請求,并執行操作。

    4.4.3 請求方和接收方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎么被接收,以及操作是否被執行、何時被執行,以及是怎么被執行的。

    4.4.4 使請求本身成為一個對象,這個對象和其它對象一樣可以被存儲和傳遞。

    4.4.5 命令模式的關鍵在于引入了抽象命令接口,且發送者針對抽象命令接口編程,只有實現了抽象命令接口的具體命令才能與接收者相關聯。 

5. 模式總結

  5.1 優點

    5.1.1 解除了請求者與實現者之間的耦合,降低了系統的耦合度。

    5.1.2 對請求排隊或記錄請求日志,支持撤銷操作。

    5.1.3 可以容易地設計一個組合命令。

    5.1.4 新命令可以容易地加入到系統中。

  5.2 缺點

    5.2.1 因為針對每一個命令都需要設計一個具體命令類,使用命令模式可能會導致系統有過多的具體命令類。

  5.3 適用場景

    5.3.1 當需要對行為進行“記錄、撤銷/重做”等處理時。

    5.3.2 系統需要將請求者和接收者解耦,使得調用者和接收者不直接交互。

    5.3.3 系統需要在不同時間指定請求、請求排隊和執行請求。

    5.3.4 系統需要將一組操作組合在一起,即支持宏命令。

6. 應用舉例:銀行帳號的存款、提款

  6.1 類圖

http://files.VeVB.COm/file_images/article/201606/2016060110144611.png

  6.2 代碼實現

 /// <summary> /// 銀行帳號 /// </summary> public class Account {  /// <summary>  /// 帳號總金額  /// </summary>  private decimal totalAmount { get; set; }  /// <summary>  /// 存錢  /// </summary>  /// <param name="amount"></param>  public void MoneyIn(decimal amount)  {   this.totalAmount += amount;  }  /// <summary>  /// 取錢  /// </summary>  /// <param name="amount"></param>  public void MoneyOut(decimal amount)  {   this.totalAmount -= amount;  }  public decimal GetTotalAmout()  {   return totalAmount;  } } public abstract class Command {  protected Account account;  public Command(Account account)  {   this.account = account;  }  public abstract void Execute(); } /// <summary> /// 存款命令 /// </summary> public class MoneyInCommand : Command {  private decimal amount;  public MoneyInCommand(Account account, decimal amount)   : base(account)  {   this.amount = amount;  }  /// <summary>  /// 實現存錢命令  /// </summary>  public override void Execute()  {   account.MoneyIn(amount);  } } /// <summary> /// 取款命令類 /// </summary> public class MoneyOutCommand : Command {  private decimal amount;  public MoneyOutCommand(Account account, decimal amount)   : base(account)  {   this.amount = amount;  }  /// <summary>  /// 實現取錢命令  /// </summary>  public override void Execute()  {   account.MoneyOut(amount);  } } public class Invoker {  private Command command;  public void SetCommand(Command command)  {   this.command = command;  }  public void ExecuteCommand()  {   command.Execute();  } }

  6.3 客戶端代碼

 class Program {  static void Main(string[] args)  {   // 創建銀行帳號   Account account = new Account();   // 創建一個存入500元的命令   Command commandIn = new MoneyInCommand(account,500);   // 創建一個調度者   BankAccount.Invoker invoker = new BankAccount.Invoker();   // 設置存錢命令   invoker.SetCommand(commandIn);   // 執行   invoker.ExecuteCommand();   Console.WriteLine("The current amount is " + account.GetTotalAmout().ToString("N2"));   // 再次存入500   Command commandIn2 = new MoneyInCommand(account, 500);   invoker.SetCommand(commandIn2);   invoker.ExecuteCommand();   Console.WriteLine("The current amount is " + account.GetTotalAmout().ToString("N2"));   // 取出300   Command commandOut = new MoneyOutCommand(account, 300);   invoker.SetCommand(commandOut);   invoker.ExecuteCommand();   Console.WriteLine("The current amount is " + account.GetTotalAmout().ToString("N2"));   Console.Read();  } }

  執行結果

http://files.VeVB.COm/file_images/article/201606/2016060110144612.png

以上就是本文的全部內容,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲另类欧美自拍| 欧美午夜激情小视频| 久久精品电影一区二区| 丝袜美腿精品国产二区| 亚洲精品自拍偷拍| 中文字幕日韩视频| 欧美日韩午夜激情| 伊人伊成久久人综合网小说| 国产精品女人网站| 精品中文字幕久久久久久| 亚洲欧美另类人妖| 久久久国产精品视频| 奇米成人av国产一区二区三区| 91精品免费看| 亚洲一区二区日本| 国产玖玖精品视频| 久久精品最新地址| 亚洲国产精久久久久久| 色噜噜狠狠狠综合曰曰曰88av| 国产在线播放91| 亚洲精品国精品久久99热| 中文字幕无线精品亚洲乱码一区| 亲子乱一区二区三区电影| 精品亚洲男同gayvideo网站| 亚洲欧美中文在线视频| 欧美日韩在线第一页| 久久九九精品99国产精品| 成人97在线观看视频| 久久大大胆人体| 国产精品久久久久久久久影视| 国产99久久精品一区二区 夜夜躁日日躁| 4438全国成人免费| 久久久久久久久久国产精品| 一区二区日韩精品| 精品亚洲一区二区三区| 亚洲国产女人aaa毛片在线| 亚洲一区二区三区sesese| 亚洲女人天堂av| 日韩在线视频播放| 日韩一二三在线视频播| 亚洲国产成人精品久久久国产成人一区| 国产欧美在线视频| 午夜精品久久17c| 亚洲va欧美va国产综合久久| 最近2019年手机中文字幕| 性欧美xxxx视频在线观看| 日韩免费观看av| 亚洲天天在线日亚洲洲精| 亚洲一区二区在线播放| 日韩精品免费一线在线观看| 亚洲精品视频久久| 亚洲精品电影在线| 久久久免费精品视频| 欧美性少妇18aaaa视频| 久久久成人精品视频| 亚洲精品午夜精品| 日韩av123| 久久精品国产亚洲精品2020| 97碰在线观看| 久久精品亚洲国产| 午夜精品福利视频| 日韩国产高清视频在线| 亚洲国产精品国自产拍av秋霞| 97精品视频在线播放| 国产精品电影在线观看| 久久精品成人一区二区三区| 成人在线视频网| 亚洲国产一区二区三区在线观看| 中文字幕日韩精品在线| 91精品国产91久久久久久不卡| www.欧美精品| 亚洲福利影片在线| 久久久999精品| 久久97久久97精品免视看| 性欧美xxxx视频在线观看| 国产精品久久不能| 欧美一级bbbbb性bbbb喷潮片| 国产精品国模在线| 日韩中文字在线| 日韩精品视频免费| 成人免费看黄网站| 国产99久久精品一区二区| 青草热久免费精品视频| 欧美精品在线免费观看| 国产精品揄拍500视频| 色婷婷亚洲mv天堂mv在影片| 青青草原一区二区| 久久久精品久久久| 欧美日韩中文字幕日韩欧美| 亚洲日韩欧美视频一区| 亚洲国模精品私拍| 亚洲一区二区三区四区视频| 国产精品亚洲激情| 亚洲人成网站色ww在线| 亚洲精品wwwww| 欧美极品少妇xxxxⅹ免费视频| 亚洲成人久久久| 欧美亚洲日本黄色| 亚洲片国产一区一级在线观看| 亚洲欧美制服中文字幕| 国产精品人成电影| 亚洲性猛交xxxxwww| 亚洲精品女av网站| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲片国产一区一级在线观看| 国产成人精品日本亚洲| 91系列在线观看| 国产美女精彩久久| 亚洲新声在线观看| 91成人天堂久久成人| 亚洲色图美腿丝袜| 国产日韩在线免费| 精品久久香蕉国产线看观看亚洲| 欧美激情网站在线观看| 91免费电影网站| www.99久久热国产日韩欧美.com| 亚洲第一精品电影| 欧美尺度大的性做爰视频| 色偷偷88888欧美精品久久久| 97福利一区二区| 亚洲天堂第一页| 亚洲最大中文字幕| 在线看国产精品| 精品久久久视频| 亚洲女在线观看| 国产一区玩具在线观看| 亚洲电影免费在线观看| 欧美另类xxx| 亚洲精品www久久久| 日韩精品中文字| 欧美精品中文字幕一区| 色婷婷**av毛片一区| 91中文精品字幕在线视频| 国产精品最新在线观看| 国产精品国产三级国产aⅴ9色| 亚洲第一精品夜夜躁人人爽| 国产精品高潮粉嫩av| 日韩欧美中文免费| 97涩涩爰在线观看亚洲| 在线丨暗呦小u女国产精品| 欧亚精品中文字幕| 精品久久久久久久中文字幕| 欧美日韩亚洲视频一区| 国产亚洲一区二区精品| 欧美影院成年免费版| 国产精品国内视频| 91精品久久久久久久| 亚洲久久久久久久久久久| 精品福利在线看| 亚洲精品videossex少妇| 日韩av在线免费播放| 欧美激情欧美激情| 国产一级揄自揄精品视频| 91国自产精品中文字幕亚洲| 亚洲第一天堂av| 欧美亚洲第一页| 色婷婷av一区二区三区在线观看| 国产精品久久久| 午夜精品蜜臀一区二区三区免费| 92国产精品久久久久首页| 欧美疯狂性受xxxxx另类| 久久精品国产亚洲精品| 国产伊人精品在线| 国产精品人成电影|