using System.Collections.Generic;
public interface ICommand
void Execute(ImageReceiver receiver);
void Undo(ImageReceiver receiver);
public class BrightnessCommand : ICommand
private readonly int _amount;
private int _previousBrightness;
public BrightnessCommand(int amount)
public void Execute(ImageReceiver receiver)
_previousBrightness = receiver.Brightness;
receiver.AdjustBrightness(_amount);
public void Undo(ImageReceiver receiver)
receiver.SetBrightness(_previousBrightness);
public class ContrastCommand : ICommand
private readonly int _amount;
private int _previousContrast;
public ContrastCommand(int amount)
public void Execute(ImageReceiver receiver)
_previousContrast = receiver.Contrast;
receiver.AdjustContrast(_amount);
public void Undo(ImageReceiver receiver)
receiver.SetContrast(_previousContrast);
public class SepiaFilterCommand : ICommand
public void Execute(ImageReceiver receiver)
receiver.ApplySepiaFilter();
public void Undo(ImageReceiver receiver)
receiver.RemoveSepiaFilter();
public class BlurFilterCommand : ICommand
public void Execute(ImageReceiver receiver)
receiver.ApplyBlurFilter();
public void Undo(ImageReceiver receiver)
receiver.RemoveBlurFilter();
public class CommandManager
private readonly Stack<ICommand> _undoStack = new Stack<ICommand>();
private readonly Stack<ICommand> _redoStack = new Stack<ICommand>();
public void ExecuteCommand(ICommand command, ImageReceiver receiver)
command.Execute(receiver);
_undoStack.Push(command);
public void Undo(ImageReceiver receiver)
if (_undoStack.Count > 0)
ICommand command = _undoStack.Pop();
_redoStack.Push(command);
Console.WriteLine("No hay comandos para deshacer.");
public void Redo(ImageReceiver receiver)
if (_redoStack.Count > 0)
ICommand command = _redoStack.Pop();
command.Execute(receiver);
_undoStack.Push(command);
Console.WriteLine("No hay comandos para rehacer.");
public class ImageReceiver
public int Brightness { get; private set; }
public int Contrast { get; private set; }
public bool SepiaFilterApplied { get; private set; }
public bool BlurFilterApplied { get; private set; }
public ImageReceiver(int brightness, int contrast)
public void AdjustBrightness(int amount)
Console.WriteLine($"Brillo ajustado a: {Brightness}");
public void SetBrightness(int brightness)
Console.WriteLine($"Brillo restablecido a: {Brightness}");
public void AdjustContrast(int amount)
Console.WriteLine($"Contraste ajustado a: {Contrast}");
public void SetContrast(int contrast)
Console.WriteLine($"Contraste restablecido a: {Contrast}");
public void ApplySepiaFilter()
SepiaFilterApplied = true;
Console.WriteLine("Filtro sepia aplicado.");
public void RemoveSepiaFilter()
SepiaFilterApplied = false;
Console.WriteLine("Filtro sepia retirado.");
public void ApplyBlurFilter()
BlurFilterApplied = true;
Console.WriteLine("Filtro de desenfoque aplicado.");
public void RemoveBlurFilter()
BlurFilterApplied = false;
Console.WriteLine("Filtro de desenfoque retirado.");
static void Main(string[] args)
ImageReceiver image = new ImageReceiver(100, 100);
CommandManager commandManager = new CommandManager();
Console.WriteLine("Seleccione una opción:");
Console.WriteLine("1. Ajustar brillo");
Console.WriteLine("2. Ajustar contraste");
Console.WriteLine("3. Aplicar filtro sepia");
Console.WriteLine("4. Aplicar filtro de desenfoque");
Console.WriteLine("5. Deshacer");
Console.WriteLine("6. Rehacer");
Console.WriteLine("7. Salir");
string input = Console.ReadLine();
Console.WriteLine("Introduzca el valor de ajuste de brillo:");
if (int.TryParse(Console.ReadLine(), out int brightnessAmount))
commandManager.ExecuteCommand(new BrightnessCommand(brightnessAmount), image);
Console.WriteLine("Introduzca el valor de ajuste de contraste:");
if (int.TryParse(Console.ReadLine(), out int contrastAmount))
commandManager.ExecuteCommand(new ContrastCommand(contrastAmount), image);
commandManager.ExecuteCommand(new SepiaFilterCommand(), image);
commandManager.ExecuteCommand(new BlurFilterCommand(), image);
commandManager.Undo(image);
commandManager.Redo(image);
Console.WriteLine("Saliendo del programa...");
Console.WriteLine("Opción no válida.");