{"id":1544,"date":"2023-04-16T11:06:52","date_gmt":"2023-04-16T04:06:52","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=1544"},"modified":"2023-05-21T17:14:10","modified_gmt":"2023-05-21T10:14:10","slug":"csharp-command-pattern","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-command-pattern\/","title":{"rendered":"C# Command Pattern"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn about the C# Command design pattern and how to use it to make your application more flexible and extensible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to the C# command design pattern<\/h2>\n\n\n\n<p>The Command pattern is a behavioral design pattern that encapsulates a request as an object, thereby allowing the requester to be decoupled from the object that operates.<\/p>\n\n\n\n<p>The Command pattern encapsulates the request as a command object that contains all the necessary information to execute the request.<\/p>\n\n\n\n<p>The requester doesn&#8217;t need to know the details of how the command is executed. Instead, it simply requests the execution of the command by calling its execute method.<\/p>\n\n\n\n<p>This makes your application more flexible and extensible because the requester can easily switch out different commands without the need of understanding how those commands are executed.<\/p>\n\n\n\n<p>Because the command object stores the necessary information to reverse or replay the operation, the Command pattern enables features like undo and redo. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C# Command pattern structure<\/h3>\n\n\n\n<p>The following UML diagram illustrates the Command design pattern:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/04\/csharp-command-design-pattern.svg\" alt=\"c# Command design pattern\" class=\"wp-image-1603\"\/><\/figure>\n\n\n\n<p>In this diagram:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ICommand<\/code>: Defines the <a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-interface\/\">interface<\/a> for executing an operation.<\/li>\n\n\n\n<li><code>ConcreteCommand<\/code>: Implements the <code>ICommand<\/code> interface and defines the binding between a <code>Receiver<\/code> object and an action. The <code>ConcreteCommand<\/code> implements the <code>Execute()<\/code> and <code>Undo()<\/code> method by calling the corresponding operations on the <code>Receiver<\/code> object.<\/li>\n\n\n\n<li>Client: Creates <code>ConcreteCommand<\/code> objects and sets their receivers.<\/li>\n\n\n\n<li>Receiver: Knows how to perform the operations associated with carrying out a request.<\/li>\n\n\n\n<li>Invoker: Asks the command to carry out the request.<\/li>\n<\/ul>\n\n\n\n<p>Collaboration between participants:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The <code>Client<\/code> creates a <code>ConcreteCommand<\/code> object and tells it which receiver object should receive the command.<\/li>\n\n\n\n<li>An <code>Invoker<\/code> object saves the <code>ConcreteCommand<\/code> object.<\/li>\n\n\n\n<li>The <code>Invoker<\/code> calls the <code>Execute<\/code> method on the <code>ICommand<\/code> object to carry out the request. If the command is undoable, the <code>ConcreteCommand<\/code> object stores information needed to undo the command before calling <code>Execute<\/code> method.<\/li>\n\n\n\n<li>The <code>ConcreteCommand<\/code> object then directs the <code>Receiver<\/code> to perform the necessary actions to fulfill the request.<\/li>\n<\/ul>\n\n\n\n<p>The following shows how to implement the command pattern in C# (without <code>Undo()<\/code> method, more on this in the next example):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">CommandDesignPattern<\/span>;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Receiver<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Action<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Perform an action\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ConcreteCommand<\/span> : <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> Receiver Receiver\n    {\n        <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">ConcreteCommand<\/span>(<span class=\"hljs-params\">Receiver receiver<\/span>)<\/span>\n    {\n        Receiver = receiver;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><\/span>)<\/span> =&gt; Receiver.Action();\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Invoker<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> ICommand? Command\n    {\n        <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Invoke<\/span>(<span class=\"hljs-params\"><\/span>)<\/span> =&gt; Command?.Execute();\n\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Client<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> receiver = <span class=\"hljs-keyword\">new<\/span> Receiver();\n        <span class=\"hljs-keyword\">var<\/span> concreteCommand = <span class=\"hljs-keyword\">new<\/span> ConcreteCommand(receiver);\n\n        <span class=\"hljs-keyword\">var<\/span> invoker = <span class=\"hljs-keyword\">new<\/span> Invoker\n        {\n            Command = concreteCommand\n        };\n\n        invoker.Invoke();\n\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">C# Command pattern example<\/h2>\n\n\n\n<p>The following program defines a <code>Calculator<\/code> class with methods for basic arithmetic operations including adding, subtracting, multiplying, and dividing that update the current value.<\/p>\n\n\n\n<p>In the <code>Main()<\/code> method of the <code>Program<\/code> class, we create an instance of the <code>Calculator<\/code> class, add 20 to the current value, subtract 5 from it, and then display the current value of the calculator in the console:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">CommandPattern<\/span>;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Calculator<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> CurrentValue\n    {\n        <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">set<\/span>;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Add<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToAdd<\/span>)<\/span> =&gt; CurrentValue += valueToAdd;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Subtract<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToSubtract<\/span>)<\/span> =&gt; CurrentValue -= valueToSubtract;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Divide<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToDivide<\/span>)<\/span> =&gt; CurrentValue \/= valueToDivide;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Mutiply<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToMultiply<\/span>)<\/span> =&gt; CurrentValue *= valueToMultiply;\n\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Run<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> calculator = <span class=\"hljs-keyword\">new<\/span> Calculator();\n        calculator.Add(<span class=\"hljs-number\">20<\/span>);\n        calculator.Subtract(<span class=\"hljs-number\">5<\/span>);\n\n        Console.WriteLine(calculator.CurrentValue);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-number\">15<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The program currently doesn&#8217;t support the undo feature because it is not using the Command pattern. To add the undo feature, we can refactor the program by applying the Command pattern:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">CommandPattern<\/span>;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-keyword\">value<\/span><\/span>)<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-keyword\">value<\/span><\/span>)<\/span>;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AddCommand<\/span> : <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">double<\/span> _valueToAdd;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">AddCommand<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToAdd<\/span>)<\/span>\n    {\n        _valueToAdd = valueToAdd;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue += _valueToAdd;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue -= _valueToAdd;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SubtractCommand<\/span> : <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">double<\/span> _valueToSubtract;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">SubtractCommand<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToSubtract<\/span>)<\/span>\n    {\n        _valueToSubtract = valueToSubtract;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue -= _valueToSubtract;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue += _valueToSubtract;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DivideCommand<\/span> : <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">double<\/span> _valueToDivide;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">DivideCommand<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToDivide<\/span>)<\/span>\n    {\n        _valueToDivide = valueToDivide;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue \/= _valueToDivide;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue *= _valueToDivide;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MultiplyCommand<\/span> : <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">double<\/span> _valueToMultiply;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">MultiplyCommand<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToMultiply<\/span>)<\/span>\n    {\n        _valueToMultiply = valueToMultiply;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue *= _valueToMultiply;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue \/= _valueToMultiply;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Calculator<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> CurrentValue\n    {\n        <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">set<\/span>;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> Stack&lt;ICommand&gt; _commandHistory = <span class=\"hljs-keyword\">new<\/span>();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">ExecuteCommand<\/span>(<span class=\"hljs-params\">ICommand command<\/span>)<\/span>\n    {\n        CurrentValue = command.Execute(CurrentValue);\n        _commandHistory.Push(command);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> command = _commandHistory.Pop();\n        CurrentValue = command.Undo(CurrentValue);\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> calculator = <span class=\"hljs-keyword\">new<\/span> Calculator();\n        calculator.ExecuteCommand(<span class=\"hljs-keyword\">new<\/span> AddCommand(<span class=\"hljs-number\">20<\/span>));\n        calculator.ExecuteCommand(<span class=\"hljs-keyword\">new<\/span> SubtractCommand(<span class=\"hljs-number\">10<\/span>));\n        calculator.ExecuteCommand(<span class=\"hljs-keyword\">new<\/span> MultiplyCommand(<span class=\"hljs-number\">5<\/span>));\n        Console.WriteLine(calculator.CurrentValue);\n\n        calculator.Undo();\n        Console.WriteLine(calculator.CurrentValue);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, create an <code>ICommand<\/code> interface that has two methods <code>Execute<\/code> and <code>Undo<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-keyword\">value<\/span><\/span>)<\/span>;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-keyword\">value<\/span><\/span>)<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, define the <code>AddCommand<\/code> that implements the <code>ICommand<\/code> interface. The <code>AddCommand<\/code> adds a value to a current value:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AddCommand<\/span> : <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">double<\/span> _valueToAdd;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">AddCommand<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToAdd<\/span>)<\/span>\n    {\n        _valueToAdd = valueToAdd;\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue += _valueToAdd;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue -= _valueToAdd;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Execute()<\/code> method adds a value to the current value. And the <code>Undo()<\/code> method subtracts the same value from the current value.<\/p>\n\n\n\n<p>Similarly, define the <code>SubtractCommand<\/code>, <code>MultiplyCommand<\/code>, and <code>DivideCommand<\/code> classes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SubtractCommand<\/span> : <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">double<\/span> _valueToSubtract;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">SubtractCommand<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToSubtract<\/span>)<\/span>\n    {\n        _valueToSubtract = valueToSubtract;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue -= _valueToSubtract;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue += _valueToSubtract;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DivideCommand<\/span> : <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">double<\/span> _valueToDivide;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">DivideCommand<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToDivide<\/span>)<\/span>\n    {\n        _valueToDivide = valueToDivide;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue \/= _valueToDivide;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue *= _valueToDivide;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MultiplyCommand<\/span> : <span class=\"hljs-title\">ICommand<\/span>\n{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">readonly<\/span> <span class=\"hljs-keyword\">double<\/span> _valueToMultiply;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">MultiplyCommand<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> valueToMultiply<\/span>)<\/span>\n    {\n        _valueToMultiply = valueToMultiply;\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Execute<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue *= _valueToMultiply;\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">double<\/span> currentValue<\/span>)<\/span> =&gt; currentValue \/= _valueToMultiply;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, define the <code>Calculator<\/code> class that executes a command and undoes it:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Calculator<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">double<\/span> CurrentValue\n    {\n        <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">set<\/span>;\n    }\n\n    <span class=\"hljs-keyword\">public<\/span> Stack&lt;ICommand&gt; _commandHistory = <span class=\"hljs-keyword\">new<\/span>();\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">ExecuteCommand<\/span>(<span class=\"hljs-params\">ICommand command<\/span>)<\/span>\n    {\n        CurrentValue = command.Execute(CurrentValue);\n        _commandHistory.Push(command);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Undo<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> command = _commandHistory.Pop();\n        CurrentValue = command.Undo(CurrentValue);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The <code>Calculator<\/code> class has a <code>CurrentValue<\/code> property that represents its current value. Also, it has a private field <code>_commandHistory<\/code> that keeps track of previously executed commands.<\/p>\n\n\n\n<p>The <code>ExecuteCommand<\/code> method takes an <code><code>ICommand<\/code><\/code> object. The method calls the <code>Execute()<\/code> method of an <code><code>ICommand<\/code><\/code> object with the current value of the calculator and then adds the <code><code>ICommand<\/code><\/code> object to the command history stack.<\/p>\n\n\n\n<p>The <code>Undo<\/code> method pops the most recent command off of the command history stack, calls the <code>Undo<\/code> method of the command with the current value of the calculator, and updates the <code>CurrentValue<\/code> property with the result.<\/p>\n\n\n\n<p>Finally, define the <code>Program<\/code> class that demonstrates the ability to execute and undo commands using the Command pattern:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-keyword\">var<\/span> calculator = <span class=\"hljs-keyword\">new<\/span> Calculator();\n        calculator.ExecuteCommand(<span class=\"hljs-keyword\">new<\/span> AddCommand(<span class=\"hljs-number\">20<\/span>)); <span class=\"hljs-comment\">\/\/ -&gt; 20<\/span>\n        calculator.ExecuteCommand(<span class=\"hljs-keyword\">new<\/span> SubtractCommand(<span class=\"hljs-number\">10<\/span>)); <span class=\"hljs-comment\">\/\/ -&gt; 10<\/span>\n        calculator.ExecuteCommand(<span class=\"hljs-keyword\">new<\/span> MultiplyCommand(<span class=\"hljs-number\">5<\/span>)); <span class=\"hljs-comment\">\/\/ -&gt; 50<\/span>\n        Console.WriteLine(calculator.CurrentValue); <span class=\"hljs-comment\">\/\/ output 50<\/span>\n\n        calculator.Undo(); <span class=\"hljs-comment\">\/\/ 10<\/span>\n        Console.WriteLine(calculator.CurrentValue); <span class=\"hljs-comment\">\/\/ output 10<\/span>\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-number\">50<\/span>\n<span class=\"hljs-number\">10<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the <code>Main()<\/code> method: <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>First, create a new instance of the <code>Calculator<\/code> class.<\/li>\n\n\n\n<li>Next, execute three commands including  <code>AddCommand<\/code>, <code>SubtractCommand<\/code>, and <code>MultiplyCommand<\/code> using the <code>ExecuteCommand<\/code> method of the <code>Calculator<\/code> object with the appropriate arguments (20, 10, and 5, respectively).<\/li>\n\n\n\n<li>Then, display the <code>CurrentValue<\/code> of the <code>Calculator<\/code> object to the console.<\/li>\n\n\n\n<li>After that, call the <code>Undo<\/code> method of the <code>Calculator<\/code> object, which undoes the most recent command (the <code>MultiplyCommand<\/code> in this case) and updates the <code>CurrentValue<\/code> property of the <code>Calculator<\/code> object with the result of the undo operation.<\/li>\n\n\n\n<li>Finally, print the updated current value of the calculator to the console.<\/li>\n<\/ul>\n\n\n\n<p>In this program, the following objects map to the Command pattern:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ICommand<\/code> interface: defines the common methods that all concrete commands should implement.<\/li>\n\n\n\n<li><code>AddCommand<\/code>, <code>SubtractCommand<\/code>, <code>MultiplyCommand<\/code>, and <code>DivideCommand<\/code> classes: concrete commands that implement the <code>ICommand<\/code> interface and encapsulate the operations that can be executed on the <code>CurrentValue<\/code> property of the <code>Calculator<\/code> object.<\/li>\n\n\n\n<li><code>Calculator<\/code> class: the invoker that receives and stores the concrete commands. It executes the commands by calling their <code>Execute<\/code> methods, and undoes them by calling their <code>Undo<\/code> methods.<\/li>\n\n\n\n<li><code>Program<\/code> class: the client that creates a <code>Calculator<\/code> object and executes the concrete commands on it. It also invokes the <code>Undo<\/code> method of the <code>Calculator<\/code> object to undo the last executed command.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use the command pattern to decouple the requester and receiver of a request by encapsulating the request as an object.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"1544\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-command-pattern\/\"\n\t\t\t\tdata-post-title=\"C# Command Pattern\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"1544\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-command-pattern\/\"\n\t\t\t\tdata-post-title=\"C# Command Pattern\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>in this tutorial, you&#8217;ll learn about the C# Command design pattern and how to use it to make your application more flexible and extensible.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1441,"menu_order":11,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1544","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1544","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/comments?post=1544"}],"version-history":[{"count":5,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1544\/revisions"}],"predecessor-version":[{"id":1805,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1544\/revisions\/1805"}],"up":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1441"}],"wp:attachment":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/media?parent=1544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}