Шаблон проектирования State
Шаблон проектирования State относится к поведенческим паттернам и используется для изменения поведения объекта в зависимости от внутреннего состояния. Основная идея заключается в делегировании обработки различных состояний внешним классам, представляющим сами состояния, что позволяет избежать сложных условных конструкций (if
, switch
) внутри основного класса.
Суть шаблона
Паттерн State решает проблему, возникающую при изменении внутренних условий объекта. Вместо того чтобы реализовывать сложную систему проверок условий прямо в классе, ответственность за поведение распределяется между специализированными объектами — состояниями. Каждый объект состояния реализует своё уникальное поведение, зависящее от текущего контекста системы.
Пример реализации на PHP
Рассмотрим простой пример использования шаблона State на примере управления состоянием светофора. Светофор имеет три возможных состояния: красный, жёлтый и зелёный. Каждое состояние обладает своим поведением, которое определяет порядок смены сигналов.
Интерфейс состояния:
interface LightState {
public function handle();
}
Конкретные классы состояний:
class RedLight implements LightState {
private TrafficLightContext $context;
public function __construct(TrafficLightContext $context) {
$this->context = $context;
}
public function handle() {
echo 'Красный сигнал горит' . PHP_EOL;
sleep(5); // задержка для примера
$this->context->setState(new GreenLight($this->context));
}
}
class YellowLight implements LightState {
private TrafficLightContext $context;
public function __construct(TrafficLightContext $context) {
$this->context = $context;
}
public function handle() {
echo 'Жёлтый сигнал мигает' . PHP_EOL;
sleep(2); // задержка для примера
$this->context->setState(new RedLight($this->context));
}
}
class GreenLight implements LightState {
private TrafficLightContext $context;
public function __construct(TrafficLightContext $context) {
$this->context = $context;
}
public function handle() {
echo 'Зелёный сигнал горит' . PHP_EOL;
sleep(7); // задержка для примера
$this->context->setState(new YellowLight($this->context));
}
}
Контекст, управляющий сменой состояний:
class TrafficLightContext {
private LightState $state;
public function setState(LightState $state): void {
$this->state = $state;
}
public function run(): void {
while(true){
$this->state->handle(); // управление состоянием осуществляется объектом состояния
}
}
}
Использование:
$trafficLight = new TrafficLightContext();
$trafficLight->setState(new RedLight($trafficLight)); // начальное состояние красного сигнала
$trafficLight->run(); // запускаем цикл переключений состояний
Преимущества шаблона State:
- Уменьшение сложности классов путём разделения логики на отдельные объекты.
- Легкость добавления новых состояний без модификации существующего кода.
- Улучшенная читаемость и поддержка благодаря отсутствию длинных блоков условных операторов.
Таким образом, шаблон State помогает создать гибкую архитектуру приложения, легко адаптируемую к изменениям бизнес-требований.