Статья
Шаблон проектирования "Команда"

Шаблон проектирования "Команда"

23 ноября 2017

Шаблон представляет интерфейс для пользователя, но в отличие от фасада, который нужен для упрощения интерфейса, шаблон "Команда" создает классы-команды, которые реализуют общий интерфейс и отделяет инициатора команды от получателя.

Исходный класс:

class SecuritySystem
{
    public function enableHallSecuritySystem()
    {
       ...
    }

    public function enableBathroomSecuritySystem()
    {
       ...
    }

    public function enableDiningRoomSecuritySystem()
    {
       ...
    }

    public function disableLobbySecuritySystem()
    {
       ...
    }

    public function disableHallSecuritySystem()
    {
       ...
    }

    public function disableBathroomSecuritySystem()
    {
       ...
    }

    public function disableDiningRoomSecuritySystem()
    {
       ...
    }

    public function disableLobbySecuritySystem()
    {
       ...
    }
}

 

Сформируем набор команд:

interface Command
{
    public function execute();
}

class TurnOn implements Command
{
    protected $system;

    public function __construct(SecuritySystem $system)
    {
        $this->system = $system;
    }

    public function execute()
    {
        $this->system->enableHallSecuritySystem();
        $this->system->enableBathroomSecuritySystem();
        $this->system->enableDiningRoomSecuritySystem();
        $this->system->enableLobbySecuritySystem();
    }
}

class TurnOff implements Command
{
    protected $system;

    public function __construct(SecuritySystem $system)
    {
        $this->system = $system;
    }

    public function execute()
    {
        $this->system->disableHallSecuritySystem();
        $this->system->disableBathroomSecuritySystem();
        $this->system->disableDiningRoomSecuritySystem();
        $this->system->disableLobbySecuritySystem();
    }
}

 

Создаем класс-получателя команд:

class Control
{
    public function submit(Command $command)
    {
        $command->execute();
    }
}

 

Использование:

$system = new SecuritySystem();

$turnOn = new TurnOn($system);
$turnOff = new TurnOff($system);

$control = new Control();
$control->submit($turnOn);
$control->submit($turnOff);



Источники:

http://designpatternsphp.readthedocs.io/ru/latest/Behavioral/Command/README.html
https://habrahabr.ru/company/mailru/blog/325492/