11. Modo de estrategia de estrategia

Defina un conjunto de algoritmos, encapsule cada algoritmo y conviértalos en intercambiables.

El modo de estrategia es la encapsulación de algoritmos. Una serie de algoritmos se encapsulan en las clases correspondientes, y estas clases implementan la misma interfaz y se pueden reemplazar entre sí.

Modo de estrategia y modo de plantilla

Entre los patrones de comportamiento mencionados anteriormente, hay un patrón que también se centra en la encapsulación de algoritmos: el patrón del método de plantilla. La diferencia entre el patrón de estrategia y el patrón de método de plantilla es solo la adición de una clase de encapsulación independiente Contexto , que es diferente del patrón de método de plantilla. la diferencia es que: en el modo de método de plantilla, el algoritmo de cuerpo de llamada en la clase padre abstracta, y el modo de política, el algoritmo de llamada del cuerpo está encapsulado en un contexto de clases contenedoras , la estrategia de política abstracta normalmente es una interfaz, solo para Definir especificaciones, que generalmente no contienen lógica. De hecho, esta es solo una implementación general, y en la programación real, debido a que inevitablemente existe la misma lógica entre cada clase de implementación de estrategia específica, para evitar la duplicación de código, a menudo usamos clases abstractas para desempeñar el papel de Estrategia y encapsular al público en ella. Codifique, por lo tanto, en muchos escenarios de aplicación, generalmente verá la sombra del modo de método de plantilla en el modo de estrategia.

El método de plantilla se enfatiza más:
1) Definir una línea (proceso de algoritmo), se pueden cambiar múltiples puntos en la línea (la implementación específica se completa en la subclase) y se deben ejecutar múltiples puntos en la línea, y deben Se ejecuta de acuerdo con un proceso específico.
2) El flujo del algoritmo tiene una sola entrada y el acceso al punto está restringido [generalmente se usa una función virtual protegida para definir el punto variable].

El modelo de estrategia presta más atención a: Una "estrategia" es un algoritmo completo (completo), y el algoritmo puede ser reemplazado por el todo. El método de la plantilla solo se puede reemplazar por puntos específicos, y el flujo del algoritmo es fijo e inmutable.

Ejemplo de código

1.	interface IStrategy {  
2.	    public void doSomething();  
3.	}  
4.	class ConcreteStrategy1 implements IStrategy {  
5.	    public void doSomething() {  
6.	        System.out.println("具体策略1");  
7.	    }  
8.	}  
9.	class ConcreteStrategy2 implements IStrategy {  
10.	    public void doSomething() {  
11.	        System.out.println("具体策略2");  
12.	    }  
13.	}  
14.	class Context {  
15.	    private IStrategy strategy;  
16.	      
17.	    public Context(IStrategy strategy){  
18.	        this.strategy = strategy;  
19.	    }  
20.	      
21.	    public void execute(){  
22.	        strategy.doSomething();  
23.	    }  
24.	}  
25.	  
26.	public class Client {  
27.	    public static void main(String[] args){  
28.	        Context context;  
29.	        System.out.println("-----执行策略1-----");  
30.	        context = new Context(new ConcreteStrategy1());  
31.	        context.execute();  
32.	  
33.	        System.out.println("-----执行策略2-----");  
34.	        context = new Context(new ConcreteStrategy2());  
35.	        context.execute();  
36.	    }  
37.	}  

Estructura del modo de estrategia

  • Clase de encapsulación: también llamada contexto, para encapsular la estrategia dos veces, el propósito es evitar la llamada directa de la estrategia por parte del módulo de alto nivel.
  • Estrategia abstracta: Generalmente, es una interfaz. Cuando hay lógica repetida en cada clase de implementación, se utilizan clases abstractas para encapsular esta parte del código común. En este momento, el patrón de estrategia se parece más a un patrón de método de plantilla.
  • Estrategia específica: el rol de la estrategia específica generalmente lo asume un grupo de clases que encapsulan algoritmos, y estas clases se pueden reemplazar libremente según sea necesario.

Ventajas y desventajas del modo de estrategia

  1. Las clases de estrategia se pueden cambiar libremente, dado que las clases de estrategia se implementan desde la misma abstracción, se pueden cambiar libremente.
  2. Fácil de extender, agregar una nueva estrategia es muy fácil para el modo de estrategia, básicamente se puede extender sin cambiar el código original.
  3. Evite el uso de condiciones múltiples. Si no usa el modo de estrategia, debe usar declaraciones condicionales para conectar todos los algoritmos y determinar qué algoritmo usar a través del juicio condicional. El uso de juicios condicionales múltiples es muy difícil de mantener.

Hay dos desventajas principales del modelo de estrategia:

  1. El mantenimiento de cada clase de estrategia supondrá una sobrecarga adicional para el desarrollo, y todos pueden tener experiencia en esta área: en general, si el número de clases de estrategia supera las 5, es más problemático.
  2. Todas las clases de estrategias deben estar expuestas al cliente (llamador), porque la estrategia a utilizar la determina el cliente. Por lo tanto, el cliente debe saber qué estrategias están disponibles y comprender las diferencias entre las diversas estrategias. De lo contrario, las consecuencias Muy serio. Por ejemplo, existe un modo de estrategia de algoritmo de clasificación que proporciona tres algoritmos: clasificación rápida, clasificación de burbujas y clasificación selectiva. Antes de utilizar estos algoritmos, ¿el cliente debe comprender la aplicabilidad de estos tres algoritmos? Para otro ejemplo, el cliente necesita usar un contenedor, que se implementa con listas y matrices vinculadas. ¿El cliente también necesita comprender la diferencia entre listas vinculadas y matrices? En este sentido, es contrario a la ley de Dimit.

Escenarios de uso del modo de estrategia

Aquellos que hacen diseño orientado a objetos deben estar muy familiarizados con el patrón de estrategia, porque es esencialmente la herencia y el polimorfismo en orientado a objetos. Después de leer el código general del patrón de estrategia, puede considerar usarlo al menos en los dos casos siguientes Modo de estrategia,

  1. Las principales lógicas de las distintas clases son las mismas, pero los algoritmos y comportamientos de algunas lógicas son ligeramente diferentes.
  2. Hay varios comportamientos o algoritmos similares, y el cliente necesita decidir dinámicamente cuál usar, luego el modo de estrategia se puede usar para encapsular estos algoritmos para que el cliente los llame.

El modo de estrategia es un modo simple y de uso común. Cuando estamos desarrollando, a menudo lo usaremos intencional o no intencionalmente. En general, el modo de estrategia no se usará solo. A menudo se mezcla con el modo de método de plantilla, modo de fábrica, etc. .

La diferencia entre el modo de estrategia y el modo de agente

La gran diferencia en la función entre el modo de proxy simple y el modo de estrategia es: en el 

modo de proxy simple, la clase de proxy conoce el comportamiento de la clase de proxy, porque la clase de proxy y la clase de proxy implementan la misma interfaz, por lo que la clase de proxy y la clase de proxy La estructura de la clase es la misma; 

en el modo de estrategia, el contenedor de estrategia no conoce la información detallada de la estrategia interna, porque el contenedor no implementa la misma interfaz que la estrategia interna, es decir, el contenedor y la estrategia interna son solo una relación de combinación simple. El comportamiento de la estrategia se extrajo e implementó de manera uniforme. 

Supongo que te gusta

Origin blog.csdn.net/sinat_37138973/article/details/88248371
Recomendado
Clasificación