=====Command===== **Команда** — это поведенческий паттерн, позволяющий заворачивать запросы или простые операции в отдельные объекты.\\ \\ Это позволяет откладывать выполнение команд, выстраивать их в очереди, а также хранить историю и делать отмену.\\ ====Применимость==== Паттерн можно часто встретить в PHP-коде, особенно когда нужно откладывать выполнение команд, выстраивать их в очереди, а также хранить историю и делать отмену. ====Признаки применения паттерна==== Классы команд построены вокруг одного действия и имеют очень узкий контекст. Объекты команд часто подаются в обработчики событий элементов GUI. \\ Практически любая реализация отмены использует принципа команд. ====Концептуальный пример==== {{ :php:шаблоны_проектирования:command.png |}} Этот пример показывает структуру паттерна Команда, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом. /** * Интерфейс Команды. */ interface ICommand { public function execute(); public function undo(); public function redo(); } class GoOffLine implements ICommand { protected $user; public function __construct(User $user) { $this->user = $user; } public function execute() { $this->user->goOffLine(); } public function undo() { $this->user->goOnLine(); } public function redo() { $this->execute(); } } class GoOnLine implements ICommand { protected $user; public function __construct(User $user) { $this->user = $user; } public function execute() { $this->user->goOnLine(); } public function undo() { $this->user->goOffLine(); } public function redo() { $this->execute(); } } class User { public function goOnLIne() { echo "User go onLine
"; } public function goOffLIne() { echo "User go offLine
"; } } /** * Отправитель связан с одной или несколькими командами. Он отправляет запрос * команде. */ class ChatInterface { private $command; public function setCommand (ICommand $command) { $this->command = $command; } public function run() { echo __METHOD__ . " : "; $this->command->execute(); } public function undo() { echo __METHOD__ . " : "; $this->command->undo(); } public function redo() { echo __METHOD__ . " : "; $this->command->redo(); } } $chat = new ChatInterface(); $user = new User(); $chat->setCommand(new GoOnLIne($user)); $chat->run(); $chat->undo(); $chat->redo(); echo "-------------------------------------------
"; $chat->setCommand(new GoOffLIne($user)); $chat->run(); $chat->undo(); $chat->redo();
**Результат выполнения** {{:php:шаблоны_проектирования:screenshot_1.png|}}