Мне нужно создать шаблон стратегии, в котором пользователь выбирает четыре стратегии из списка из двадцати или тридцати уникальных объектов стратегии.Список стратегий будет расширяться по мере взросления проекта, и пользователи могут изменить выбранную стратегию в любое время.
Я планирую сохранить названия стратегий, которые они выбрали, в виде строк, а затем использовать такой метод, как этотчтобы загрузить классы стратегий, которые соответствуют выбранным строкам.
class StrategyManager { // simplified for the example
public $selectedStrategies = array();
public function __construct($userStrategies) {
$this->selectedStrategies = array(
'first' => new $userStrategies['first'],
'second' => new $userStrategies['second'],
'third' => new $userStrategies['third'],
'fourth' => new $userStrategies['fourth']
);
}
public function do_first() {
$this->selectedStrategies['first']->execute();
}
public function do_second() {
$this->selectedStrategies['second']->execute();
}
public function do_third() {
$this->selectedStrategies['third']->execute();
}
public function do_fourth() {
$this->selectedStrategies['fourth']->execute();
}
}
Я пытаюсь избежать большого оператора switch.Меня беспокоит то, что это вроде Stringly Typed
.Есть ли лучший способ достичь этой цели без использования условного или большого оператора switch?
Кстати: пользователь не вводит строку при выборе четырех стратегий.Мне нужно будет вести список строк для представления пользователю в поле выбора и добавлять новые в список по мере добавления новых объектов стратегии.
Объяснение
ircmaxell выразил некоторое замешательство относительно того, что я пытаюсь сделать.В приведенном выше примере пользователь выбрал четыре стратегии из списка, и они передаются конструктору StrategyManager в виде массива строк.Соответствующие объекты стратегии создаются и хранятся во внутреннем массиве, $this->selectedStrategies
«first», «second», «third» и «четвертый» являются ключами массива внутреннего массива для четырех различных выбранныхстратегии.После создания объекта StrategyManager приложение использует метод execute
из четырех стратегий в разные моменты времени процесса.
Итак, в двух словах ... каждый раз, когда приложению требуетсявыполнить метод Стратегии номер «один», он это делает, и результаты различаются в зависимости от того, какая стратегия была выбрана пользователем для Стратегии «один»