程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 設計形式系列教程-敕令形式

C# 設計形式系列教程-敕令形式

編輯:C#入門知識

C# 設計形式系列教程-敕令形式。本站提示廣大學習愛好者:(C# 設計形式系列教程-敕令形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C# 設計形式系列教程-敕令形式正文


1. 概述

  將一個要求封裝為一個對象(即我們創立的Command對象),從而使你可用分歧的要求對客戶停止參數化; 對要求列隊或記載要求日記,和支撐可撤消的操作。

2. 處理的成績

  在軟件體系中,行動要求者與行動完成者平日是一種緊耦合的關系,但某些場所,好比須要對行動停止記載、撤消或重做、事務等處置時,這類沒法抵抗變更的緊耦合的設計就不太適合。

3. 形式中腳色

  3.1 籠統敕令(Command):界說敕令的接口,聲明履行的辦法。

  3.2 詳細敕令(ConcreteCommand):詳細敕令,完成要履行的辦法,它平日是“虛”的完成;平日會有吸收者,並挪用吸收者的功效來完成敕令要履行的操作。

  3.3 吸收者(Receiver):真正履行敕令的對象。任何類都能夠成為一個吸收者,只需能完成敕令請求完成的響應功效。

  3.4 挪用者(Invoker):請求敕令對象履行要求,平日會持有敕令對象,可以持有許多的敕令對象。這個是客戶端真正觸發敕令並請求敕令履行響應操作的處所,也就是說相當於應用敕令對象的進口。

  3.5 客戶端(Client):敕令由客戶端來創立,並設置敕令的吸收者。

4. 形式解讀

  4.1 敕令形式的類圖

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810411744.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();
  }
 }

  履行成果

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810411701.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 類圖

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810411751.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();
  }
 }

  履行成果

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810411771.png

以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved