Поведение объекта зависит от внутреннего состояния; объект меняет класс поведения при смене состояния.
interface State { public function proceed(Order $order): void; }
class DraftState implements State { public function proceed(Order $o): void { $o->setState(new ConfirmedState()); } }
class Order {
private State $state;
public function proceed(): void { $this->state->proceed($this); }
}Избегает больших switch/if по состоянию. Переходы инкапсулированы в классах состояний.