Рассмотрим еще один шаблон программирования под названием команда (Command). Этот шаблон относится к поведенчиским шаблонам (behavioral patterns) и определяет взамиодействие между объектами.
Шаблон обеспечивает обработку команды в виде объекта, объект заключает в себя само действие и свои параметры. Шаблон команда активно применяется в WPF и Silverlight-приложениях.
Принцип действия на диаграмме ниже
Пример под катом
Во-первых, для работы опишем интерфес команды
public interface ICommand
{
void Execute();
}
Затем создадим реализацию интерфейса
public class CalculateCommand : ICommand
{
private PiCalculation piCalculation = new PiCalculation();
public long Args { get; set; }
public decimal Result { get; set; }
public void Execute()
{
piCalculation.Steps = Args;
Result = piCalculation.ParallelPartitionerPi();
}
}
Теперь создадим класс, который будет запускать список команд.
public class Invoker
{
private List<ICommand> commands;
public Invoker()
{
commands = new List<ICommand>();
}
public void Add(ICommand command)
{
commands.Add(command);
}
public void Action()
{
foreach (ICommand command in commands)
{
command.Execute();
}
}
}
И наконец создадим класс, который бы инкапсулировал в себя всю бизнес-логику. Для примера я создал класс для посчета Пи.
public class PiCalculation
{
public long Steps = 10;
public decimal ParallelPartitionerPi()
{
var sum = new decimal(0.0);
var step = new decimal(1.0 / Steps);
var obj = new object();
Parallel.ForEach(Partitioner.Create(0, Steps),
() => 0.0,
(range, state, partial) =>
{
for (long i = range.Item1; i < range.Item2; i++)
{
var x = new decimal((i + 0.5) * (double) step);
partial += 4.0 / (1.0 + (double) (x * x));
}
return partial;
},
partial => { lock (obj) sum += new decimal(partial); });
return step * sum;
}
}
Последний этам, клиентская часть
var command = new CalculateCommand {Args = 10000000};
var invoker = new Invoker();
invoker.Add(command);
invoker.Action();
Console.WriteLine("Pi = {0}", command.Result);
Console.ReadKey();