Necesito crear un patrón de estrategia donde un usuario selecciona cuatro estrategias de una lista de veinte o treinta objetos de estrategia únicos. La lista de estrategias se ampliará a medida que el proyecto madure, y los usuarios pueden cambiar su estrategia seleccionada en cualquier momento.¿Este código es demasiado frágil?
Planeo almacenar los nombres de estrategia que han seleccionado como cadenas, y luego usar un método como este para cargar las clases de estrategia que corresponden a las cadenas que seleccionaron.
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();
}
}
Estoy tratando de evitar una gran declaración de cambio. Mi preocupación es que esto parece un poco Stringly Typed
. ¿Hay una mejor manera de lograr este objetivo sin utilizar una declaración de cambio condicional o grande?
BTW: El usuario no ingresa una cadena al seleccionar las cuatro estrategias. Tendría que mantener una lista de cadenas para presentar al usuario en un cuadro de selección y agregar nuevas a la lista a medida que agregue nuevos objetos de estrategia.
Explicación
ircmaxell expresaron un poco de confusión en cuanto a qué es lo que estoy tratando de hacer. En el ejemplo anterior, el usuario ha seleccionado cuatro estrategias de una lista y las pasa al constructor de StrategyManager como una matriz de cadenas. Los objetos de estrategia correspondientes se crean y almacenan en una matriz interna, $this->selectedStrategies
"primero", "segundo", "tercero" y "cuarto" son las teclas de matriz de la matriz interna para las cuatro estrategias diferentes seleccionadas. Después de que se haya generado el objeto StrategyManager, la aplicación utiliza el método execute
de las cuatro estrategias durante varios momentos durante la vida del proceso.
Entonces, en pocas palabras ... cada vez que la aplicación necesita ejecutar el método de Estrategia número "uno" lo hace, y los resultados son diferentes dependiendo de qué estrategia fue seleccionada por el usuario para la Estrategia "uno"
Estoy confundido. Son las estrategias posibles "primero", "segundo", "tercero" y "cuarto", o son una serie de comandos para la estrategia seleccionada (que se eligen antes de construir el administrador). Y si es así, ¿funcionaría mejor un patrón [Chain of Responsibility] (http://sourcemaking.com/design_patterns/chain_of_responsibility) o [Command] (http://sourcemaking.com/design_patterns/command)? ¿Podría explicar qué es exactamente lo que está tratando de hacer (y qué hace el código, por qué existen las diferentes estrategias)? – ircmaxell
Actualizaré la pregunta. – Stephen
¿Siempre hay 4 estrategias? ¿Y siempre se ejecutan en secuencia? ¿O son cuatro estrategias que de otro modo no estarían relacionadas y que están tratando de manejar juntas? – ircmaxell