Паттерн Команда (Command)…

Паттерн Команда (также известен как Action(действие) или Transaction(транзакция)) - инкапсулирует запрос в виде объекта, позволяя тем самым параметризовывать клиентов типом запроса, устанавливать очередность запросов, протоколировать их и поддерживать отмену выполнения операций. Это определние из книги Банды Четырех (GoF). Этот паттерн относится к паттернам поведения (то есть характеризует то, как объекты или классы взаимодействуют между собой) и если говорить о нем в целом, то главным его предназначением является избежание зависимости от конкретных операций и “ослабление” связей между классами для улучшения гибкости системы.

Рассмотрим UML диаграмму шаблона:

Command0

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 диаграмма:

wiki_uml_small

В итоге, клиентское приложение (наша консоль или окно) создает экземпляр User и начинает обрабатывать поступающие команды (Compute, Undo, Redo). При этом выполнение команд происходит не в самих методах класса, а передается в виде объектов типа CalculatorCommand на выполнение (в методы Execute() и UnExecute()). В свою очередь выполнение происходит в методе Operation()класса Calculator, который выполняет операции. Таким образом взаимодействие между вызывающим классом (User) и получаетелем (Calculator), происходит посредством CalculatorCommand, что дает нам возможность добавлять новые команды, не изменяя никакие существующие классы, а также расширять функционал самой команды.

2. Сопрограммы, Паттерн “Команда”, C# - реализация от valker. Подробней читайте у него на блоге, я же приведу UML диаграмму его реализации:

valker_uml_small

3. Command Design Pattern in C# 2.0 - реализация, построенная на использовании generic’ов:

uml_generic_small

4. Design Patterns: Command Pattern - одна глав из книги. В принципе ничем особенным не отличается от первой реализации.

File iconCommand_Pattern.rar (58 K) реализации (1-4)

5. Использование паттерна “Команда” - самая лучшая статья из всех. Не хватает только UML. Показан пример создания win-меню на основе паттерна.

6. Command - реализация похожая на 1-ую.

7. Расширение возможностей паттерна Command - тоже отличная статья, только код уже на Delphi.

Опубликовано в Design Patterns.

Ответить