El patrón de estrategia funciona bien para evitar grandes construcciones if ... else y hace que sea más fácil agregar o reemplazar funcionalidades. Sin embargo, todavía deja un defecto en mi opinión. Parece que en cada implementación todavía tiene que haber una construcción ramificada. Puede ser una fábrica o un archivo de datos. Como ejemplo, tome un sistema de pedidos.
Fábrica:
// All of these classes implement OrderStrategy
switch (orderType) {
case NEW_ORDER: return new NewOrder();
case CANCELLATION: return new Cancellation();
case RETURN: return new Return();
}
El código después de esto no necesita preocuparse, y solo hay un lugar para agregar un nuevo tipo de orden ahora, pero esta sección de código aún no es extensible. Sacarlo a un archivo de datos ayuda un poco a la legibilidad (discutible, lo sé):
<strategies>
<order type="NEW_ORDER">com.company.NewOrder</order>
<order type="CANCELLATION">com.company.Cancellation</order>
<order type="RETURN">com.company.Return</order>
</strategies>
Pero esto aún agrega código repetitivo para procesar el archivo de datos: un código más fácil de probar y relativamente estable, pero complejidad adicional no obstante.
Además, este tipo de construcción no prueba bien la integración. Cada estrategia individual puede ser más fácil de probar ahora, pero cada nueva estrategia que agregue es una complejidad adicional para probar. Es menos de lo que tendría si no hubiera usado el patrón, pero todavía está allí.
¿Hay alguna manera de implementar el patrón de estrategia que mitigue esta complejidad? ¿O es tan simple como parece, e intentar ir más allá solo agregaría otra capa de abstracción para poco o ningún beneficio?
eval
... ¿podría no funcionar en Java pero quizás en otros idiomas?