Содержание

Command

Команда — это поведенческий паттерн, позволяющий заворачивать запросы или простые операции в отдельные объекты.

Это позволяет откладывать выполнение команд, выстраивать их в очереди, а также хранить историю и делать отмену.

Применимость

Паттерн можно часто встретить в PHP-коде, особенно когда нужно откладывать выполнение команд, выстраивать их в очереди, а также хранить историю и делать отмену.

Признаки применения паттерна

Классы команд построены вокруг одного действия и имеют очень узкий контекст. Объекты команд часто подаются в обработчики событий элементов GUI.
Практически любая реализация отмены использует принципа команд.

Концептуальный пример

Этот пример показывает структуру паттерна Команда, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.

/**
 * Интерфейс Команды.
 */
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 <span style='color: red; font-weight: bold'>onLine</span><br>";
    }
    public function goOffLIne() {
        echo "User go <span style='color: blue; font-weight: bold'>offLine</span><br>";
    }
}
 
 
/**
 * Отправитель связан с одной или несколькими командами. Он отправляет запрос
 * команде.
 */
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 "------------------------------------------- <br>";
$chat->setCommand(new GoOffLIne($user));
$chat->run();
$chat->undo();
$chat->redo();

Результат выполнения