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 敕令形式的類圖

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();
}
}
履行成果

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 類圖

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();
}
}
履行成果

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