Состояние (State) :: Cетевой уголок Majestio

Состояние (State)


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

Применимость

Подробнее на 👉 refactoring.guru

UML-диаграмма

Пример реализации

#include <iostream>

// Интерфейс состояния

class State {
 public:
  virtual void handle() = 0;
};

// Конкретное состояние 1

class ConcreteState1 : public State {
 public:
  void handle() override {
    std::cout << "Обработка в конкретном состоянии 1" << std::endl;
  }
};

// Конкретное состояние 2

class ConcreteState2 : public State {
 public:
  void handle() override {
    std::cout << "Обработка в конкретном состоянии 2" << std::endl;
  }
};

// Контекст

class Context {
 private:
  State* state;

 public:
  void setState(State* newState) { state = newState; }

  void request() { state->handle(); }
};

// Клиентский код

int main() {
  Context context;
  ConcreteState1 state1;
  ConcreteState2 state2;

  context.setState(&state1);
  context.request();

  context.setState(&state2);
  context.request();

  return 0;
}
Будет напечатано:
Обработка в конкретном состоянии 1
Обработка в конкретном состоянии 2
abstract class State {
  void handle();
}

class ConcreteState1 implements State {
  @override
  void handle() {
    print('Обработка в конкретном состоянии 1');
  }
}

class ConcreteState2 implements State {
  @override
  void handle() {
    print('Обработка в конкретном состоянии 2');
  }
}

class Context {
  State? _state;

  void setState(State newState) {
    _state = newState;
  }

  void request() {
    _state?.handle();
  }
}

void main() {
  var context = Context();
  var state1 = ConcreteState1();
  var state2 = ConcreteState2();

  context.setState(state1);
  context.request();

  context.setState(state2);
  context.request();
}
Будет напечатано:
Обработка в конкретном состоянии 1
Обработка в конкретном состоянии 2
Рейтинг: 0/5 - 0 голосов