Что такое паттерн "Состояние" (State)
Состояние — поведенческий паттерн проектирования, который позволяет объекту менять своё поведение в зависимости от внутреннего состояния. При этом объект ведёт себя как экземпляр разных классов в разные моменты времени.
Представьте проигрыватель музыки, который по-разному реагирует на нажатия кнопок в состояниях «воспроизведение», «пауза» и «стоп». Паттерн Состояние помогает организовать такое поведение без громоздких условных операторов.
Преимущества паттерна «Состояние»
- Избавляет от множества условных конструкций в коде.
- Легко расширяется за счёт добавления новых состояний.
- Повышает читаемость и поддерживаемость кода.
Пример:
- Контекст — основной объект, у которого меняется поведение.
- Состояния — отдельные классы, реализующие поведение для каждого состояния.
- Контекст делегирует вызовы методам текущего состояния.
Где применяется паттерн «Состояние»?
- Управление жизненным циклом объектов.
- В UI для управления разными режимами работы.
- В играх для управления поведением персонажей.
Пример реализации на JavaScript
// Интерфейс состояния class State { handle(context) { throw new Error("Метод handle() должен быть реализован"); } } // Конкретные состояния class StatePlaying extends State { handle(context) { console.log("Плеер в режиме воспроизведения"); context.setState(new StatePaused()); } } class StatePaused extends State { handle(context) { console.log("Плеер на паузе"); context.setState(new StateStopped()); } } class StateStopped extends State { handle(context) { console.log("Плеер остановлен"); context.setState(new StatePlaying()); } } // Контекст class Player { constructor() { this.state = new StateStopped(); } setState(state) { this.state = state; } pressButton() { this.state.handle(this); } } // Использование const player = new Player(); player.pressButton(); // Плеер остановлен player.pressButton(); // Плеер в режиме воспроизведения player.pressButton(); // Плеер на паузе player.pressButton(); // Плеер остановлен
Когда стоит использовать паттерн «Состояние»?
- Когда поведение объекта зависит от его состояния.
- Чтобы избежать громоздких условных операторов.
- Для упрощения добавления новых состояний.
Отличие от других паттернов
- В отличие от Стратегии, Состояние управляет внутренним состоянием объекта и меняет поведение автоматически.
Плюсы паттерна
- Упрощает код, избавляя от сложных условий.
- Легко добавлять новые состояния.
- Повышает гибкость и расширяемость.
Минусы паттерна
- Увеличивает количество классов.
- Может усложнить структуру для простых задач.