Стан

Аналогія

Припустимо, у графічному редакторі ви вибрали інструмент «Пензель». Вона змінює свою поведінку залежно від налаштування кольору: тобто малює лінію вибраного кольору.

Коротко

Шаблон дозволяє змінювати поведінку класу за зміни стану.

Вікіпедія

Шаблон "Стан" реалізує машину станів об'єктно орієнтованим способом. Це досягається за допомогою:
реалізації кожного стану у вигляді похідного класу інтерфейсу шаблону «Стан»,
реалізації переходів станів (state transitions) у вигляді виклику методів, визначених вищим класом (superclass).
Шаблон «Стан» — це у певному плані шаблон «Стратегія», у якому можливе перемикання поточної стратегії з допомогою виклику методів, визначених у інтерфейсі шаблона.


Приклад

Текстовий редактор змінює стан тексту, який ви друкуєте, тобто якщо вибрано напівжирне зображення — то редактор друкує напівжирним і т.д.

Спочатку зробимо інтерфейс станів і самі стани:

interface WritingState
{
    public function write(string $words);
}

class UpperCase implements WritingState
{
    public function write(string $words)
    {
        echo strtoupper($words);
    }
}

class LowerCase implements WritingState
{
    public function write(string $words)
    {
        echo strtolower($words);
    }
}

class Default implements WritingState
{
    public function write(string $words)
    {
        echo $words;
    }
}

Створемо редактор:

class TextEditor
{
    protected $state;

    public function __construct(WritingState $state)
    {
        $this->state = $state;
    }

    public function setState(WritingState $state)
    {
        $this->state = $state;
    }

    public function type(string $words)
    {
        $this->state->write($words);
    }
}

Використання:

$editor = new TextEditor(new Default());

$editor->type('First line');

$editor->setState(new UpperCase());

$editor->type('Second line');
$editor->type('Third line');

$editor->setState(new LowerCase());

$editor->type('Fourth line');
$editor->type('Fifth line');

// Output:
// First line
// SECOND LINE
// THIRD LINE
// fourth line
// fifth line