Ahora usemos el Patrón de Estrategia, un patrón que te permite elegir la estrategia sobre la marcha. La estrategia depende del tipo de objeto. El principio detrás de este patrón es «Programar a una Interfaz y no a una Implementación». Eso hace que la solución resultante sea fácil de probar, extensible y mantenible.
Empezamos por definir la Interfaz.

1234publicinterfaceICalculate{intCalculate(int x,int y);}
CSharp
Ahora podemos implementar esta interfaz.
1234567891011121314151617181920212223clase públicaAdd:ICalcular{#región ICalcular MiembropúblicointCalcular(int x,int y){retorno x + y;}#región final}clase públicaRestar:ICalcular{#región ICalcular MiembropúblicointCalcular(int x,int y){retorno x - y;}#región final}
CSharp
Así es como llamamos al código.
1Calcular calcular =nuevoAdd();int suma = calcular.Calcular(a , b);
CSharp
Como el objeto es del tipo Add, no tenemos que comprobar el tipo (como hicimos anteriormente) para llamar a la función apropiada. Así que, en tiempo de ejecución, se llama al método de cálculo de la clase Add.
¿Qué tal si añadimos una nueva estrategia. Es tan simple como añadir otra clase. Sólo tenemos que asegurarnos de que implementa la interfaz. Vamos a crear una nueva estrategia llamada Multiplicar que implemente ICalculate.
1234567891011clase públicaMultiplicar:ICalcular{#región ICalcular MiembropúblicointCalcular(int num1,int num2){regresar núm1 * núm2;}#región final}
CSharp
Algunas observaciones:
- Este ejemplo no viola el OCP. De hecho, lo mantiene porque no modificamos una clase particular; nuestra estrategia es una nueva clase con una función específicamente definida.
- Si necesitamos eliminar una estrategia, podemos eliminar esa clase de nuestro código, y no afectará a ningún otro código (como lo habría hecho en el código heredado – habríamos tenido que eliminar esa declaración de «si no»).
- No tiene cuerdas de código duro.