using System;using System.Collections.Generic;using System.Reflection.Metadata.Ecma335;namespace ConsoleApp15
{classProgram{staticvoidMain(string[] args){// The client code can parameterize an invoker with any commands.Invoker invoker =newInvoker();
invoker.SetOnStart(newSimpleCommand("Say Hi!"));Receiver receiver =newReceiver();
invoker.SetOnFinish(newComplexCommand(receiver,"Send email","Save report"));
invoker.DoSomethingImportant();}}// The Command interface declares a method for executing a command.publicinterfaceICommand{voidExecute();}// Some commands can implement simple operations on their own.classSimpleCommand:ICommand{privatestring _payload =string.Empty;publicSimpleCommand(string payload){this._payload = payload;}publicvoidExecute(){
Console.WriteLine($"SimpleCommand: See, I can do simple things like printing ({this._payload})");}}// However, some commands can delegate more complex operations to other// objects, called "receivers."classComplexCommand:ICommand{privateReceiver _receiver;// Context data, required for launching the receiver's methods.privatestring _a;privatestring _b;// Complex commands can accept one or several receiver objects along// with any context data via the constructor.publicComplexCommand(Receiver receiver,string a,string b){this._receiver = receiver;this._a = a;this._b = b;}// Commands can delegate to any methods of a receiver.publicvoidExecute(){
Console.WriteLine("ComplexCommand: Complex stuff should be done by a receiver object.");this._receiver.DoSomething(this._a);this._receiver.DoSomethingElse(this._b);}}// The Receiver classes contain some important business logic. They know how// to perform all kinds of operations, associated with carrying out a// request. In fact, any class may serve as a Receiver.classReceiver{publicvoidDoSomething(string a){
Console.WriteLine($"Receiver: Working on ({a}.)");}publicvoidDoSomethingElse(string b){
Console.WriteLine($"Receiver: Also working on ({b}.)");}}// The Invoker is associated with one or several commands. It sends a// request to the command.classInvoker{privateICommand _onStart;privateICommand _onFinish;// Initialize commands.publicvoidSetOnStart(ICommand command){this._onStart = command;}publicvoidSetOnFinish(ICommand command){this._onFinish = command;}// The Invoker does not depend on concrete command or receiver classes.// The Invoker passes a request to a receiver indirectly, by executing a// command.publicvoidDoSomethingImportant(){
Console.WriteLine("Invoker: Does anybody want something done before I begin?");if(this._onStart is ICommand){this._onStart.Execute();}
Console.WriteLine("Invoker: ...doing something really important...");
Console.WriteLine("Invoker: Does anybody want something done after I finish?");if(this._onFinish is ICommand){this._onFinish.Execute();}}}}