Command Pattern
Summary: Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.
Sample Code
Code
public interface ICommand
{
void Execute();
}
public enum CameraCommands { ShutterSpeed, FocalDistance, ISO, Shoot }
public class ShutterSpeedCommand : ICommand
{
private float shutterSpeed;
public ShutterSpeedCommand(float shutterSpeed)
{
this.shutterSpeed = shutterSpeed;
}
public void Execute()
{
Console.WriteLine($"Setting shutter speed to {shutterSpeed} seconds.");
}
}
public class FocalDistanceCommand : ICommand
{
private int focalDistance;
public FocalDistanceCommand(int focalDistance)
{
this.focalDistance = focalDistance;
}
public void Execute()
{
Console.WriteLine($"Setting focal distance to {focalDistance} mm.");
}
}
public class ISOCommand : ICommand
{
private int ISO;
public ISOCommand(int ISO)
{
this.ISO = ISO;
}
public void Execute()
{
Console.WriteLine($"Setting ISO to {ISO}.");
}
}
public class ShootCommand : ICommand
{
public void Execute()
{
Console.WriteLine("Taking photo.");
}
}
public class CameraInvoker
{
public ICommand GetCommand(CameraCommands command, object parameter)
{
switch (command)
{
case CameraCommands.FocalDistance:
return new FocalDistanceCommand((int)parameter);
case CameraCommands.ShutterSpeed:
return new ShutterSpeedCommand((float)parameter);
case CameraCommands.ISO:
return new ISOCommand((int)parameter);
case CameraCommands.Shoot:
return new ShootCommand();
default:
return null;
}
}
}
Usage
var cameraInvoker = new CameraInvoker();
var command = cameraInvoker.GetCommand(CameraCommands.FocalDistance, 28);
command.Execute();
command = cameraInvoker.GetCommand(CameraCommands.ShutterSpeed, 0.004f);
command.Execute();
command = cameraInvoker.GetCommand(CameraCommands.ISO, 100);
command.Execute();
command = cameraInvoker.GetCommand(CameraCommands.Shoot, null);
command.Execute();
Output
Setting focal distance to 28 mm.
Setting shutter speed to 0.004 seconds.
Setting ISO to 100.
Taking photo.
Comments
Post a Comment