Summer SALE
Состояние

Состояние на Python

Состояние — это поведенческий паттерн, позволяющий динамически изменять поведение объекта при смене его состояния.

Поведения, зависящие от состояния, переезжают в отдельные классы. Первоначальный класс хранит ссылку на один из таких объектов-состояний и делегирует ему работу.

Сложность:

Популярность:

Применимость: Паттерн Состояние часто используют в Python для превращения в объекты громоздких стейт-машин, построенных на операторах switch.

Признаки применения паттерна: Методы класса делегируют работу одному вложенному объекту.

Концептуальный пример

Этот пример показывает структуру паттерна Состояние, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.

main.py: Пример структуры паттерна

from __future__ import annotations from abc import ABC, abstractmethod class Context: """ Контекст определяет интерфейс, представляющий интерес для клиентов. Он также хранит ссылку на экземпляр подкласса Состояния, который отображает текущее состояние Контекста. """ _state = None """ Ссылка на текущее состояние Контекста. """ def __init__(self, state: State) -> None: self.transition_to(state) def transition_to(self, state: State): """ Контекст позволяет изменять объект Состояния во время выполнения. """ print(f"Context: Transition to {type(state).__name__}") self._state = state self._state.context = self """ Контекст делегирует часть своего поведения текущему объекту Состояния. """ def request1(self): self._state.handle1() def request2(self): self._state.handle2() class State(ABC): """ Базовый класс Состояния объявляет методы, которые должны реализовать все Конкретные Состояния, а также предоставляет обратную ссылку на объект Контекст, связанный с Состоянием. Эта обратная ссылка может использоваться Состояниями для передачи Контекста другому Состоянию. """ @property def context(self) -> Context: return self._context @context.setter def context(self, context: Context) -> None: self._context = context @abstractmethod def handle1(self) -> None: pass @abstractmethod def handle2(self) -> None: pass """ Конкретные Состояния реализуют различные модели поведения, связанные с состоянием Контекста. """ class ConcreteStateA(State): def handle1(self) -> None: print("ConcreteStateA handles request1.") print("ConcreteStateA wants to change the state of the context.") self.context.transition_to(ConcreteStateB()) def handle2(self) -> None: print("ConcreteStateA handles request2.") class ConcreteStateB(State): def handle1(self) -> None: print("ConcreteStateB handles request1.") def handle2(self) -> None: print("ConcreteStateB handles request2.") print("ConcreteStateB wants to change the state of the context.") self.context.transition_to(ConcreteStateA()) if __name__ == "__main__": # Клиентский код. context = Context(ConcreteStateA()) context.request1() context.request2() 

Output.txt: Результат выполнения

Context: Transition to ConcreteStateA ConcreteStateA handles request1. ConcreteStateA wants to change the state of the context. Context: Transition to ConcreteStateB ConcreteStateB handles request2. ConcreteStateB wants to change the state of the context. Context: Transition to ConcreteStateA 

Состояние на других языках программирования

Состояние на C# Состояние на C++ Состояние на Go Состояние на Java Состояние на PHP Состояние на Ruby Состояние на Rust Состояние на Swift Состояние на TypeScript