Стан
Аналогія
Припустимо, у графічному редакторі ви вибрали інструмент «Пензель». Вона змінює свою поведінку залежно від налаштування кольору: тобто малює лінію вибраного кольору.
Коротко
Шаблон дозволяє змінювати поведінку класу за зміни стану.
Вікіпедія
Шаблон "Стан" реалізує машину станів об'єктно орієнтованим способом. Це досягається за допомогою:
реалізації кожного стану у вигляді похідного класу інтерфейсу шаблону «Стан»,
реалізації переходів станів (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