MixaDIOR Feodosian

Барахло/Хлам/PHP/Харьков/Феодосия/Я

Паттерн проектирования Command(Комманда)

Май 16th, 2008 in Новости

Поведенческий паттерн.

Основные тезисы:

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

Применяеться: Undo/redo, транзакции, progress bar.

Пример:

Задача - создать приложения для запуска сервисов в ОС.

Реализация - для данной задачи применяем паттерн проектирования “комманда”.

Создадим класс, который будет запускать сервисы:

http://www.feodosian.com/.work/commandPattern/src/v0/servicesManager.phps

Создадим класс сервиса:

http://www.feodosian.com/.work/commandPattern/src/v0/Service/Squid.phps

Класс сервиса реализует паттерн “комманда”. У него есть методы start, stop и isRunned в которых инкапсулирована логика старта нашего сервиса, остановки нашего сервиса и проверки, того запустился ли он(проверка состояния), эти методы должны быть в любом классе сервиса(можно также создать интерфейс). В этих методах у нас описано поведение, этого сервиса при запуске и остановке, например в приведенном примере, если при старте не удался запуск хоть одной из комманд, вызывается метод метод stop у тех, что успели запуститься, тоесть фактически мы, благодаря общему интерфейсу для нашей комманды, реализовали простенькую транзакцию. В моем примере, когда сервис Squid стартует, то выполняеться обход всех комманд (объекты комманд добавлены в конструкторе класса, а их логика описана в классах Command_Squid и Command_Sarg - http://www.feodosian.com/.work/commandPattern/src/v0/Command/ ), добавленных в него и запуск их, если запуск хоть одной из них не удаеться, то происходит stop всех, что успели запуститься.

В чем “коммандность” данного решения - именно в том, что мы просто добавляем объекты комманд и те в свою очередь компонуються в сервис, который инкапсуриет в себе логику запуска или остановки, в зависимости от поведения своих комманд. Естественно, каждая из добавленных в сервис комманд может тоже реализовывать данный паттерн. Залог успеха - выбор единого стандарта для названия методов запуска и остановки сервиса и проверки его состояния.

Мой пример на PHP:

Скачать:
http://www.feodosian.com/downloads/commandPatt…

Исходники онлайн:
http://www.feodosian.com/.work/commandPattern/src/v0/

В деле:
http://www.feodosian.com/.work/commandPattern/v0/

Ссылки:

http://en.wikipedia.org/wiki/Command_pattern
http://c2.com/cgi/wiki?CommandPattern
http://www.phppatterns.com/docs/design/the_command_pattern

З.Ы.

этот пост еще корректируеться и дополняеться.

Tags: , ,

Leave a Reply

Архивы