Мне нужно создать шаблон стратегии, в котором пользователь выбирает четыре стратегии из списка из двадцати или тридцати уникальных объектов стратегии. Список стратегий будет расширяться по мере развития проекта, и пользователи могут изменить свою выбранную стратегию в любое время.
Я планирую сохранить выбранные ими названия стратегий в виде строк, а затем использовать такой метод, чтобы загрузить классы стратегии, соответствующие выбранным ими строкам.
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?
BTW: Пользователь не вводит строку при выборе четырех стратегий. Мне нужно было бы вести список строк для представления пользователю в поле выбора и добавлять новые в список по мере добавления новых объектов стратегии.
Объяснение
ircmaxell выразило некоторую путаницу относительно что я пытаюсь сделать. В приведенном выше примере пользователь выбрал четыре стратегии из списка, и они передаются конструктору StrategyManager в виде массива строк. Соответствующие объекты стратегии создаются и сохраняются во внутреннем массиве, $ this-> selectedStrategies
"first", "second", "third" и "4th" являются ключами внутреннего массива для четырех различных выбранных стратегий. После создания объекта StrategyManager приложение использует метод execute
из четырех стратегий в различные моменты в течение жизненного цикла процесса.
Итак, в двух словах ... каждый раз, когда приложению требуется для выполнения метода Стратегии номер «один» он выполняет это, и результаты будут разными в зависимости от того, какая стратегия была выбрана пользователем для Стратегии «один»