Приветствую Вас, Гость · RSS Понедельник, 07.10.2024, 21:18










Главная » 2014 » Февраль » 26 » Шаблоны программирования: комманда (Command)
03:16
 

Шаблоны программирования: комманда (Command)

Рассмотрим еще один шаблон программирования под названием команда (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();
Просмотров: 743 | Добавил: hamaget | Рейтинг: 0.0/0
Всего комментариев: 0
Создать бесплатный сайт с uCoz
Copyright MyCorp © 2024