225 lines
5.9 KiB
C#
225 lines
5.9 KiB
C#
/* Команда
|
||
Инкапсулирует запрос в виде объекта
|
||
позволяя передавать их клиентам в
|
||
качестве параметров, ставить в очередь,
|
||
логировать, а также поддерживать отмену
|
||
операций
|
||
*/
|
||
class Program
|
||
{
|
||
static void Main()
|
||
{
|
||
#region Пример №1 - базовое
|
||
var initCommand = new Invoker(new ConcreteCommand(new Receiver()));
|
||
initCommand.Run();
|
||
initCommand.Cancel();
|
||
Console.WriteLine("Please press Enter...");
|
||
Console.ReadKey();
|
||
#endregion
|
||
#region Пример №2 - пульт управления конвеерной установкой
|
||
var conveyor = new Conveyor(); // создаём конвеер
|
||
var multipult = new Multipult(); // создаём пульт управления конвеером
|
||
multipult.SetCommand(0, new ConveyorWorkCommand(conveyor));
|
||
multipult.SetCommand(1, new ConveyorAjustCommand(conveyor));
|
||
|
||
multipult.PressOn(0);
|
||
multipult.PressOn(1);
|
||
multipult.PressCansel();
|
||
multipult.PressCansel();
|
||
#endregion
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Описания общего поведения объекта
|
||
/// </summary>
|
||
abstract class Command
|
||
{
|
||
public abstract void Execute();
|
||
public abstract void Undo();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Описание процесса создания команды
|
||
/// </summary>
|
||
class ConcreteCommand : Command
|
||
{
|
||
Receiver receiver;
|
||
|
||
public ConcreteCommand(Receiver receiver)
|
||
{
|
||
this.receiver = receiver;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Инициализация команды
|
||
/// *вызывает его получателя
|
||
/// </summary>
|
||
public override void Execute()
|
||
{
|
||
receiver.Operation();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Остановка команды
|
||
/// </summary>
|
||
public override void Undo()
|
||
{
|
||
Console.WriteLine("Stop");
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Описание возможностей получателя команды
|
||
/// </summary>
|
||
class Receiver
|
||
{
|
||
/// <summary>
|
||
/// Обработка получателем команды
|
||
/// </summary>
|
||
public void Operation()
|
||
{
|
||
Console.WriteLine("Processing...");
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Описание инициатора команды
|
||
/// </summary>
|
||
class Invoker
|
||
{
|
||
Command command;
|
||
|
||
/// <summary>
|
||
/// Принимает в себя команду
|
||
/// </summary>
|
||
/// <param name="command">#</param>
|
||
public Invoker(Command command)
|
||
{
|
||
this.command = command;
|
||
}
|
||
|
||
/// <summary>
|
||
/// Запускает команду
|
||
/// </summary>
|
||
public void Run()
|
||
{
|
||
command.Execute();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Отменяет выполнение команды
|
||
/// </summary>
|
||
public void Cancel()
|
||
{
|
||
command.Undo();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Поведение команды
|
||
/// </summary>
|
||
interface ICommand
|
||
{
|
||
void Positive();
|
||
void Negative();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Класс конвеера
|
||
/// </summary>
|
||
class Conveyor
|
||
{
|
||
public void On() => Console.WriteLine("Включение конвеера");
|
||
|
||
public void Off() => Console.WriteLine("Выключение конвеера");
|
||
|
||
public void SpeedIncrease() => Console.WriteLine("Скорость конвеера увеличена");
|
||
|
||
public void SpeedDecrease() => Console.WriteLine("Скорость конвеера снижена");
|
||
}
|
||
|
||
/// <summary>
|
||
/// Класс управления работой конвеера
|
||
/// </summary>
|
||
class ConveyorWorkCommand : ICommand
|
||
{
|
||
public Conveyor conveer;
|
||
|
||
/// <summary>
|
||
/// Передача типа конвеера в конструторе
|
||
/// </summary>
|
||
/// <param name="conveer">тип</param>
|
||
public ConveyorWorkCommand(Conveyor conveer) => this.conveer = conveer;
|
||
|
||
public void Negative() => conveer.Off();
|
||
|
||
public void Positive() => conveer.On();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Класс регулировки конвеера
|
||
/// </summary>
|
||
class ConveyorAjustCommand : ICommand
|
||
{
|
||
public Conveyor conveer;
|
||
|
||
/// <summary>
|
||
/// Передача типа конвеера в конструторе
|
||
/// </summary>
|
||
/// <param name="conveer">тип</param>
|
||
public ConveyorAjustCommand(Conveyor conveer) => this.conveer = conveer;
|
||
|
||
public void Negative() => conveer.SpeedDecrease();
|
||
|
||
public void Positive() => conveer.SpeedIncrease();
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// Пульт управления конвеером
|
||
/// </summary>
|
||
class Multipult
|
||
{
|
||
/// <summary>
|
||
/// Все возможные команды
|
||
/// </summary>
|
||
private List<ICommand> commands;
|
||
|
||
/// <summary>
|
||
/// История выполненных команд для возможной их отмены
|
||
/// </summary>
|
||
private Stack<ICommand> history;
|
||
|
||
public Multipult()
|
||
{
|
||
commands = new List<ICommand>() { null, null };
|
||
history = new Stack<ICommand>();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Устанавлием список команд по индексу кнопки
|
||
/// </summary>
|
||
public void SetCommand(int btn, ICommand command) => commands[btn] = command;
|
||
|
||
/// <summary>
|
||
/// Вызывает команду из списка по указанному индексу
|
||
/// и запишет в историю команд выполненную команду
|
||
/// </summary>
|
||
/// <param name="btn">идекс кнопки</param>
|
||
public void PressOn(int btn)
|
||
{
|
||
commands[btn].Positive();
|
||
history.Push(commands[btn]);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Извлекает команду из истории и отменяет её
|
||
/// </summary>
|
||
public void PressCansel()
|
||
{
|
||
if(history.Count == 0) return;
|
||
var oldC = history.Pop();
|
||
oldC.Negative();
|
||
}
|
||
} |