Стратегия (Strategy) :: Cетевой уголок Majestio

Стратегия (Strategy)


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

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

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

UML-диаграмма

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

#include <iostream>

// Интерфейс стратегии

class Strategy {
 public:
  virtual void execute() = 0;
};

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

class ConcreteStrategy1 : public Strategy {
 public:
  void execute() override {
    std::cout << "Выполняется конкретная стратегия 1" << std::endl;
  }
};

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

class ConcreteStrategy2 : public Strategy {
 public:
  void execute() override {
    std::cout << "Выполняется конкретная стратегия 2" << std::endl;
  }
};

// Контекст

class Context {
 private:
  Strategy* strategy;

 public:
  Context(Strategy* strategy) : strategy(strategy) {}

  void setStrategy(Strategy* newStrategy) { strategy = newStrategy; }

  void executeStrategy() { strategy->execute(); }
};

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

int main() {
  ConcreteStrategy1 strategy1;
  ConcreteStrategy2 strategy2;
  Context context(&strategy1);

  context.executeStrategy();

  context.setStrategy(&strategy2);
  context.executeStrategy();

  return 0;
}
Будет напечатано:
Выполняется конкретная стратегия 1
Выполняется конкретная стратегия 2
abstract class Strategy {
  void execute();
}

class ConcreteStrategy1 implements Strategy {
  @override
  void execute() {
    print('Выполняется конкретная стратегия 1');
  }
}

class ConcreteStrategy2 implements Strategy {
  @override
  void execute() {
    print('Выполняется конкретная стратегия 2');
  }
}

class Context {
  Strategy? _strategy;

  Context(Strategy strategy) {
    _strategy = strategy;
  }

  void setStrategy(Strategy newStrategy) {
    _strategy = newStrategy;
  }

  void executeStrategy() {
    _strategy?.execute();
  }
}

void main() {
  var strategy1 = ConcreteStrategy1();
  var strategy2 = ConcreteStrategy2();
  var context = Context(strategy1);

  context.executeStrategy();

  context.setStrategy(strategy2);
  context.executeStrategy();
}
Будет напечатано:
Выполняется конкретная стратегия 1
Выполняется конкретная стратегия 2
Рейтинг: 0/5 - 0 голосов