Definición: Defina un conjunto de algoritmos, encapsula cada algoritmo y hazlos intercambiables.
Tipo: Patrón de comportamiento
Diagrama de clases:
El patrón de política es la encapsulación de algoritmos, encapsulando una serie de algoritmos en las clases correspondientes, y estas clases implementan la misma interfaz y pueden ser reemplazadas entre sí. En el modo de clase de comportamiento mencionado anteriormente, hay un patrón que también se centra en la encapsulación del algoritmo: el modo de método de plantilla. En comparación con el diagrama de clases, puede ver que la diferencia entre el modo de política y el modo de método de plantilla es solo que hay un contexto de clase de encapsulación separado. La diferencia entre TI y el modo de método de plantilla es: en el modo de método de plantilla, el cuerpo principal del algoritmo de llamada está en la clase principal abstracta, mientras que en el modo de estrategia, el cuerpo principal del algoritmo de llamadas se encapsula en el contexto de la clase de encapsulación. La estrategia de estrategia abstracta es generalmente una interfaz, el propósito es solo definir la especificación y generalmente no contiene lógica. De hecho, esto es solo una implementación general. En la programación real, debido a que inevitablemente existe una lógica entre la misma lógica entre cada clase de implementación de estrategia específica, para evitar el código duplicado, a menudo usamos clases abstractas para desempeñar el papel de la estrategia y encapsular el código público. Por lo tanto, en muchos escenarios de aplicación, la sombra del patrón de método de plantilla generalmente se ve en el modo de estrategia.
Estructura de patrones de políticas
Clase de encapsulación: también conocida como contexto, la encapsulación secundaria de las políticas es evitar llamadas directas a las políticas por módulos de alto nivel.
Estrategia abstracta: generalmente una interfaz. Cuando hay una lógica duplicada en cada clase de implementación, las clases abstractas se utilizan para encapsular esta parte del código común. En este momento, el patrón de política se parece más al patrón de método de plantilla.
Estrategia específica: los roles de estrategia específicos generalmente se realizan mediante un conjunto de clases encapsuladas con algoritmos, y estas clases pueden reemplazarse libremente según sea necesario.
Ejemplos de escenarios de aplicación:
Liu Bei se casará con su esposa en Jiangdong. Antes de irse, Zhuge Liang le dio a Zhao Yun (el mejor hombre) tres trucos, diciendo que resolvería el problema difícil al desmontarlo según el secreto del cielo. Oye, digamos, realmente resolvió el gran problema. Al final, Zhou Yu acompañó a su esposa y luego rompió sus tropas. Primero veamos cómo se ve esta escena.
Primero hablemos sobre los elementos en esta escena: tres trucos inteligentes, un truco inteligente y un truco inteligente. El hermano Liang dio el inteligente truco. El truco inteligente se conoce comúnmente como el truco inteligente. Entonces Zhao Yun es un trabajador que saca el truco inteligente, lo ejecuta y luego gana. ¿Cómo expresar estos usando programas Java?
Echemos un vistazo a la imagen primero?
Los tres trucos son el mismo tipo de cosas, así que escribamos una interfaz:
paquete com.yangguangfu.strategy; /***** @author [email protected]: AFU* Primero defina una interfaz de estrategia, que es la interfaz de los tres trucos que Zhuge Liang le dio a Zhao Yun. */Public Interface Istrategy {// Cada truco es un algoritmo ejecutable. Public void operate (); }
Luego escriba tres clases de implementación, hay tres trucos inteligentes:
Un plan inteligente: primera llegada a Wu:
paquete com.yangguangfu.strategy; /***** @author [email protected]: un fu* solicitar que el Sr. Qiao ayude, para que Sun Quan no pueda matar a Liu Bei. */ public class Backdoor implementa Istrategy {@Override public void operate () {System.out.println ("Buscando la ayuda de Old Qiao Guo, deja que Wu Guotai presione el Sun Quan para que Sun Quan no pueda matar a Liu Bei ..."); }}
El segundo truco: por favor dale a Wu Guotai una luz verde y déjala ir:
paquete com.yangguangfu.strategy; /**** @author [email protected]: A Fu* Por favor, le dé a Wu Guotai una luz verde. */ public class GivenGreenlight implementa Istrategy {@Override public void operate () {System.out.println ("Por favor, dale a Wu Guotai una luz verde, ¡déjalo ir!"); }}
Habilidad 3: La Sra. Sun corta la parte trasera y bloquea a los perseguidores:
paquete com.yangguangfu.strategy; /**** @author [email protected]: AFU* La Sra. Sun cortó la parte trasera y bloqueó a los perseguidores. */ public class Blackenemy implementa iStrategy {@Override public void operate () {System.out.println ("Sra. Sun corta la parte posterior, bloquea los perseguidores ..."); }}
De acuerdo, todos, hay tres trucos, por lo que hay un lugar para ponerlos en la punta:
paquete com.yangguangfu.strategy; / ** * * @author [email protected]: AFU * */ context de clase pública {Estrategia privada de Istrategy; // constructor, qué truco desea utilizar el contexto público (estrategia istrategy) {this.strategy = estrategia; } public void operate () {this.strategy.operate (); }}
Entonces Zhao Yun llevaba tres consejos con gran coraje, tirando del viejo Liu Bei, que ya había entrado en las filas de los ancianos y quería casarse con una niña inocente, fue a casarse con su esposa. Hola, y mucho menos, los tres trucos del hermano Liang son realmente buenos. Mirar:
paquete com.yangguangfu.strategy; clase pública Zhaoyun { /*** Zhao Yun apareció. Según la explicación de Zhuge Liang para él, desarmó los trucos a su vez*/ public static void main (string [] args) {contexto contexto; // Cuando llegué por primera vez a Wu, desmonté el primer sistema.out.println ("-----------------------------------------"); context = nuevo contexto (nuevo Backdoor ()); context.operate (); // ejecutar system.out.println ("/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n"); //When Liu Bei was happy to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling No estar dispuesto a no estar dispuesto a no estar dispuesto a no estar dispuesto a no estar dispuesto a no estar dispuesto a no estar dispuesto a no estar dispuesto No está dispuesto a no estar dispuesto a no estar dispuesto a no estar dispuesto a no estar dispuesto a no ser desaprobar el tercer consejo System.out.println ("-------------------------------------------"); context = nuevo contexto (new Blackenemy ()); context.operate (); // desmontar y ejecutar System.out.println ("/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n N /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n N /n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n N
Ventajas y desventajas del modo de política Las principales ventajas del modo de política son:
Las clases de políticas se pueden cambiar libremente, y dado que las clases de políticas implementan la misma abstracción, se pueden cambiar libremente.
Fácil de expandir, agregar una nueva política es muy fácil para el modelo de política, y básicamente se puede ampliar sin cambiar el código original.
Evite usar múltiples condiciones. Si no utiliza el modo de política, para todos los algoritmos, las declaraciones condicionales deben usarse para conectarse y el algoritmo que se utilizará a través del juicio condicional. En el artículo anterior, mencionamos que usar un juicio condicional múltiple es muy difícil de mantener.
Hay dos desventajas principales del modelo de estrategia:
Mantener varias clases de políticas traerá gastos generales adicionales al desarrollo. Es posible que tenga experiencia a este respecto: en términos generales, el número de clases de políticas excede 5, lo cual es más problemático.
Todas las clases de políticas deben estar expuestas al cliente (la persona que llama) porque depende del cliente, por lo que el cliente debe saber qué políticas están allí y comprender las diferencias entre varias políticas, de lo contrario, las consecuencias son graves. Por ejemplo, existe un modelo de estrategia para clasificar algoritmos que proporcionan tres algoritmos: clasificación rápida, clasificación de burbujas y selección de clasificación. Antes de que el cliente use estos algoritmos, ¿deberían comprender la aplicación de estos tres algoritmos? Por ejemplo, el cliente debe usar un contenedor, que se implementa mediante 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 dimitiana.
Escenarios aplicables
Al realizar un diseño orientado a objetos, debe estar muy familiarizado con el patrón de política, porque es esencialmente herencia y polimorfismo en orientación a objetos. Después de leer el código general del patrón de política, creo que incluso si nunca antes había oído hablar del patrón de política, debo haberlo usado durante el proceso de desarrollo, ¿verdad? Al menos en las siguientes dos situaciones, puede considerar usar el modelo de estrategia.
La lógica principal de varias clases es la misma, y solo hay ligeras diferencias en el algoritmo y el comportamiento de la lógica parcial.
Hay varios comportamientos o algoritmos similares, y el cliente debe decidir dinámicamente cuál usar, para que pueda usar el patrón de política para encapsular estos algoritmos para que el cliente llame.
El modelo de estrategia es un modelo simple y comúnmente utilizado. Cuando nos estamos desarrollando, a menudo lo usamos intencionalmente o sin querer. En términos generales, el modelo de estrategia no se usará solo, y es más común usarlo de manera mixta con el modo de método de plantilla, modo de fábrica, etc.