Паттерн Команда (Command)…
Октябрь 23, 2007 — seregaborzovПаттерн Команда (также известен как Action(действие) или Transaction(транзакция)) - инкапсулирует запрос в виде объекта, позволяя тем самым параметризовывать клиентов типом запроса, устанавливать очередность запросов, протоколировать их и поддерживать отмену выполнения операций. Это определние из книги Банды Четырех (GoF). Этот паттерн относится к паттернам поведения (то есть характеризует то, как объекты или классы взаимодействуют между собой) и если говорить о нем в целом, то главным его предназначением является избежание зависимости от конкретных операций и “ослабление” связей между классами для улучшения гибкости системы.
Рассмотрим UML диаграмму шаблона:
Command - объявляет интерфейс для выполнения операции.
ConcreteCommand (Копировать, Вставить) - конкретная команда: определяет связь между объектом-получателем Receiver и действием; реализует операцию Execute путем вызова соответствующих операций объекта Receiver.
Client (Приложение) - клиент: создает объект класса ConcreteCommand и устанавливает его получателя.
Invoker (Пункт меню) - инициатор: обращается к команде для выполнения запроса.
Receiver (Приложение или диалог) - получатель: располагает информацией о способах выполнения операций, необходимых для удовлетворения запроса. В роли получателя может выступать любой класс.
Более подробно читайте у GoF, я же приведу несколько примеров реализации на С#:
1. Command Design Pattern in C# and VB.NET - этот же пример приводится и в Wiki (en-версия). Абстрактный класс Command объявляет 2 метода: Execute(), Unexecute(). Класс-наследник CalculatorCommand реализует эти базовые методы. “Общение” происходит между User (Invoker), в котором реализованы методы Отмены, Восстановления и Вычисления и Calculator (Reciever), в котором в методе Operation(…) создаются объекты CalculatorCommand.
UML диаграмма:
В итоге, клиентское приложение (наша консоль или окно) создает экземпляр User и начинает обрабатывать поступающие команды (Compute, Undo, Redo). При этом выполнение команд происходит не в самих методах класса, а передается в виде объектов типа CalculatorCommand на выполнение (в методы Execute() и UnExecute()). В свою очередь выполнение происходит в методе Operation()класса Calculator, который выполняет операции. Таким образом взаимодействие между вызывающим классом (User) и получаетелем (Calculator), происходит посредством CalculatorCommand, что дает нам возможность добавлять новые команды, не изменяя никакие существующие классы, а также расширять функционал самой команды.
2. Сопрограммы, Паттерн “Команда”, C# - реализация от valker. Подробней читайте у него на блоге, я же приведу UML диаграмму его реализации:
3. Command Design Pattern in C# 2.0 - реализация, построенная на использовании generic’ов:
4. Design Patterns: Command Pattern - одна глав из книги. В принципе ничем особенным не отличается от первой реализации.
Command_Pattern.rar (58 K) реализации (1-4)
5. Использование паттерна “Команда” - самая лучшая статья из всех. Не хватает только UML. Показан пример создания win-меню на основе паттерна.
6. Command - реализация похожая на 1-ую.
7. Расширение возможностей паттерна Command - тоже отличная статья, только код уже на Delphi.



