Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!Шпора по ООПиП (3).docx
Скачиваний:
35
Добавлен:
22.09.2019
Размер:
2.31 Mб
Скачать

89. Команда (шаблон проектирования)

шаблон проектирования, используемый при объектно-ориентированном программировании, представляющий действие. Объект команды заключает в себе само действие и его параметры.

Цель

Создание структуры, в которой класс-отправитель и класс-получатель не зависят друг от друга напрямую. Организация обратного вызова к классу, который включает в себя класс-отправитель.

Описание

Обеспечивает обработку команды в виде объекта, что позволяет сохранять её, передавать в качестве параметра методам, а также возвращать её в виде результата, как и любой другой объект.

Например, библиотека печати может иметь класс PrintJob. Для его использования можно создать объект PrintJob, установить необходимые параметры, и вызвать метод, непосредственно отсылающий задание на печать.

using System;

using System.Collections.Generic;

namespace Command

{

class MainApp

{

static void Main()

{

// Создаем пользователя.

User user = new User();

// Пусть он что-нибудь сделает.

user.Compute('+', 100);

user.Compute('-', 50);

user.Compute('*', 10);

user.Compute('/', 2);

// Отменяем 4 команды

user.Undo(4);

// Вернём 3 отменённые команды.

user.Redo(3);

// Ждем ввода пользователя и завершаемся.

Console.Read();

}

}

// "Command" : абстрактная Команда

abstract class Command

{

public abstract void Execute();

public abstract void UnExecute();

}

// "ConcreteCommand" : конкретная команда

class CalculatorCommand : Command

{

char @operator;

int operand;

Calculator calculator;

// Constructor

public CalculatorCommand(Calculator calculator,

char @operator, int operand)

{

this.calculator = calculator;

this.@operator = @operator;

this.operand = operand;

}

public char Operator

{

set{ @operator = value; }

}

public int Operand

{

set{ operand = value; }

}

public override void Execute()

{

calculator.Operation(@operator, operand);

}

public override void UnExecute()

{

calculator.Operation(Undo(@operator), operand);

}

// Private helper function : приватные вспомогательные функции

private char Undo(char @operator)

{

char undo;

switch(@operator)

{

case '+': undo = '-'; break;

case '-': undo = '+'; break;

case '*': undo = '/'; break;

case '/': undo = '*'; break;

default : undo = ' '; break;

}

return undo;

}

}

// "Receiver" : получатель

class Calculator

{

private int curr = 0;

public void Operation(char @operator, int operand)

{

switch(@operator)

{

case '+': curr += operand; break;

case '-': curr -= operand; break;

case '*': curr *= operand; break;

case '/': curr /= operand; break;

}

Console.WriteLine(

"Current value = {0,3} (following {1} {2})",

curr, @operator, operand);

}

}

// "Invoker" : вызывающий

class User

{

// Initializers

private Calculator calculator = new Calculator();

private List<Command> commands = new List<Command>();

private int current = 0;

public void Redo(int levels)

{

Console.WriteLine("\n---- Redo {0} levels ", levels);

// Делаем возврат операций

for (int i = 0; i < levels; i++)

if (current < commands.Count - 1)

commands[current++].Execute();

}

public void Undo(int levels)

{

Console.WriteLine("\n---- Undo {0} levels ", levels);

// Делаем отмену операций

for (int i = 0; i < levels; i++)

if (current > 0)

commands[--current].UnExecute();

}

public void Compute(char @operator, int operand)

{

// Создаем команду операции и выполняем её

Command command = new CalculatorCommand(

calculator, @operator, operand);

command.Execute();

// Добавляем операцию к списку отмены

commands.Add(command);

current++;

}

}

}