Prefacio
En el desarrollo de software, a menudo se encuentra que existen múltiples estrategias o algoritmos para lograr una determinada función, y se pueden seleccionar diferentes algoritmos o estrategias de acuerdo con la situación real. Si estos algoritmos o estrategias se extraen, se proporciona una interfaz unificada. Los diferentes algoritmos o estrategias tienen diferentes clases de implementación. El reemplazo dinámico de algoritmos o estrategias se puede lograr inyectando diferentes objetos de implementación. Este es el modo de estrategia
definición
El patrón de estrategia define una serie de algoritmos, encapsula cada algoritmo y los hace intercambiables. El modo de estrategia permite que el algoritmo cambie independientemente de los clientes que lo utilicen
UML
escenas que se utilizarán
- Hay varias formas de lidiar con el mismo tipo de problema, solo el comportamiento específico es diferente
- Cuando es necesario encapsular varias operaciones del mismo tipo de forma segura
- Cuando hay varias subclases de la misma clase abstracta y necesita usar if-else o switch-case para seleccionar subclases específicas
Práctica
Tomemos un ejemplo del costo del transporte público urbano. Generalmente, se implementa el precio por segmento: cuanto mayor es la distancia, mayor es el precio.
// 定义一个抽象的价格计算接口
public interface CalculateStrategy{
int calculatePrice(int km)
}
// 公交车的计算策略类
public class BusStrategy implements CalculateStrategy{
@override
public int calculatePrice(int km){
return 1 // 这里简单起见,实际按照公交车乘车规则计费
}
}
// 地铁的计算策略类
public class SubwayStrategy implements CalculateStrategy{
@override
public int calculatePrice(int km){
return 2 // 这里简单起见,实际按照地铁乘车规则计费
}
}
// 出行价格计算器
public class TranficCalculator{
CalculateStrategy mStrategy;
public void setStrategy(CalculateStrategy mStrategy){
this.mStrategy=mStrategy
}
public int calculatePrice(int km){
return mStrategy.calculatePrice(km);
}
}
public static void main(String [] args){
TranficCalculator calculator=new TranficCalculator ();
// 公交车费用
calculator.setStrategy(new BusStrategy());
// 地铁费用
calculator.setStrategy(new SubwayStrategy());
}
resumen
El modo de estrategia se utiliza principalmente para separar algoritmos, y existen diferentes estrategias de implementación específicas bajo la misma abstracción de comportamiento. Este modo es una buena demostración del principio de apertura y cierre, es decir, definir abstracciones e inyectar diferentes implementaciones para lograr una buena escalabilidad.
ventaja
- El modo de estrategia proporciona una forma de administrar familias de algoritmos relacionados, y los algoritmos se pueden cambiar
- Evite el uso de varias declaraciones de bifurcaciones condicionales
Desventaja
- El cliente conoce todas las clases de estrategia y decide qué clase de estrategia utilizar. La clase de estrategia está completamente expuesta
- A veces hay muchas clases de estrategia.