The Command Design Pattern is a behavioral design pattern that encapsulates a request as an object, thereby allowing parameterization of clients with queues, requests, and operations. This pattern decouples sender and receiver of a request based on a command, which helps in invoking the right method at the right time without knowing the actual implementation details.
Components of Command Design Pattern
- Command: Defines an interface for executing an operation.
- Concrete Command: Implements the Command interface and binds a receiver with an action. It defines a binding between the action and the receiver.
- Invoker: Requests the command to execute the operation.
- Receiver: Knows how to perform the operation.
Example Implementation in C#
Let’s consider a simple example where we have a remote control that can operate various devices like lights, fans, etc. We want to implement the Command Pattern to control these devices.
Create Command Interface (ICommand.cs)
namespace CommandPattern.Command
{
/// <summary>
/// Command Interface
/// </summary>
public interface ICommand
{
void Execute();
}
}
Create Reciver Class (Light.cs)
namespace CommandPattern.Receiver
{
/// <summary>
/// Receiver Class
/// </summary>
public class Light
{
public void TurnOn()
{
Console.WriteLine("Light is on");
}
public void TurnOff()
{
Console.WriteLine("Light is off");
}
}
}
TurnOnLightCommand.cs
using CommandPattern.Receiver;
namespace CommandPattern.Command
{
/// <summary>
/// Concrete Command
/// </summary>
public class TurnOnLightCommand : ICommand
{
private readonly Light _light;
public TurnOnLightCommand(Light light)
{
_light = light;
}
public void Execute()
{
_light.TurnOn();
}
}
}
TurnOffLightCommand.cs
using CommandPattern.Receiver;
namespace CommandPattern.Command
{
/// <summary>
/// Concrete Command
/// </summary>
public class TurnOffLightCommand : ICommand
{
private readonly Light _light;
public TurnOffLightCommand(Light light)
{
_light = light;
}
public void Execute()
{
_light.TurnOff();
}
}
}
using CommandPattern.Command;
namespace CommandPattern.Invoker
{
/// <summary>
/// Invoker Class
/// </summary>
public class RemoteControl
{
private ICommand _command;
public void SetCommand(ICommand command)
{
_command = command;
}
public void PressButton()
{
_command.Execute();
}
}
}
Client Code(Program.cs)
using CommandPattern.Command; using CommandPattern.Invoker; using CommandPattern.Receiver; Light livingRoomLight = new Light(); ICommand turnOnCommand = new TurnOnLightCommand(livingRoomLight); ICommand turnOffCommand = new TurnOffLightCommand(livingRoomLight); RemoteControl remote = new RemoteControl(); remote.SetCommand(turnOnCommand); remote.PressButton(); // Turns on the light remote.SetCommand(turnOffCommand); remote.PressButton(); // Turns off the light Console.ReadLine();
Output
In this example:
- Light acts as the receiver of the commands.
- TurnOnLightCommand and TurnOffLightCommand are concrete commands that implement the ICommand interface.
- RemoteControl acts as an invoker that can set and execute commands.
The Command Design Pattern helps in making our code more extensible and maintainable by separating the responsibility of issuing a request from the objects that execute the request. It also enables us to create composite commands by grouping multiple commands together.
The full source code is available here:
Happy coding!! 😊

No comments:
Post a Comment