Estoy totalmente a favor de la estrategia descrita en la respuesta de @DocBrown .
Voy a sugerir una mejora a la respuesta.
Las llamadas
myMap.Add(1,new Strategy1());
myMap.Add(2,new Strategy2());
myMap.Add(3,new Strategy3());
Se puede distribuir. No tiene que volver al mismo archivo para agregar otra estrategia, que se adhiere al principio de Open-Closed aún mejor.
Digamos que implementa Strategy1
en el archivo Strategy1.cpp. Puede tener el siguiente bloque de código en él.
namespace Strategy1_Impl
{
struct Initializer
{
Initializer()
{
getMap().Add(1, new Strategy1());
}
};
}
using namespace Strategy1_Impl;
static Initializer initializer;
Puede repetir el mismo código en cada archivo StategyN.cpp. Como puede ver, será mucho código repetido. Para reducir la duplicación de código, puede usar una plantilla que se puede colocar en un archivo que sea accesible para todas las Strategy
clases.
namespace StrategyHelper
{
template <int N, typename StrategyType> struct Initializer
{
Initializer()
{
getMap().Add(N, new StrategyType());
}
};
}
Después de eso, lo único que debe usar en Strategy1.cpp es:
static StrategyHelper::Initializer<1, Strategy1> initializer;
La línea correspondiente en StrategyN.cpp es:
static StrategyHelper::Initializer<N, StrategyN> initializer;
Puede llevar el uso de plantillas a otro nivel utilizando una plantilla de clase para las clases de estrategia concretas.
class Strategy { ... };
template <int N> class ConcreteStrategy;
Y luego, en lugar de Strategy1
usar ConcreteStrategy<1>
.
template <> class ConcreteStrategy<1> : public Strategy { ... };
Cambie la clase auxiliar para registrar Strategy
s en:
namespace StrategyHelper
{
template <int N> struct Initializer
{
Initializer()
{
getMap().Add(N, new ConcreteStrategy<N>());
}
};
}
Cambie el código en Strateg1.cpp a:
static StrategyHelper::Initializer<1> initializer;
Cambie el código en StrategN.cpp a:
static StrategyHelper::Initializer<N> initializer;
switch
caso y llamar a un método preexistente en su sistema complejo, o tiene que inventar tanto el método como su llamada?