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(); } }
履行成果
以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。