Pequeña charla sobre patrones de diseño (3)—Patrón de estrategia

Introducción a la columna

Dirección de columna

enlace

Introducción a la columna

Principalmente analiza y resume uno por uno los 23 patrones de diseño comunes actualmente en el mercado, espero que los amigos interesados ​​puedan echarle un vistazo y se actualizará continuamente. Espero que puedan supervisarme y podamos aprender y progresar juntos, vamos todos.
Insertar descripción de la imagen aquí

patrón de estrategia

El patrón de estrategia es un patrón de diseño de comportamiento que define una serie de algoritmos y encapsula cada algoritmo para que puedan reemplazarse entre sí. El patrón Estrategia permite que el algoritmo cambie independientemente del cliente que lo utilice.

protagonista

Cuando utilizamos el patrón de estrategia, normalmente hay tres roles principales involucrados: contexto, estrategia abstracta y estrategia concreta.

Contexto

La clase de entorno es el núcleo del patrón de estrategia: contiene una referencia a un objeto de estrategia y llama al algoritmo del objeto de estrategia de acuerdo con las necesidades específicas en tiempo de ejecución. La clase de entorno proporciona una interfaz o método para configurar y obtener objetos de política. Cuando se utiliza el patrón Estrategia en el lado del cliente, a menudo es necesario interactuar con las clases del entorno.

Estrategia abstracta

La clase de estrategia abstracta es la interfaz o clase abstracta del patrón de estrategia, que define el algoritmo que debe implementar la clase de estrategia específica. Una clase de estrategia abstracta suele contener uno o más métodos abstractos que describen el comportamiento de la estrategia. Los clientes utilizan estrategias concretas llamando a métodos en clases de estrategias abstractas.

Estrategia concreta

La clase de estrategia concreta es la clase de implementación del patrón de estrategia e implementa el algoritmo definido en la clase de estrategia abstracta. Las clases de estrategias específicas implementan una lógica de algoritmo diferente basada en necesidades comerciales específicas. Al utilizar el modo de política en el cliente, puede seleccionar la clase de política específica adecuada según sus necesidades.

Resumen de roles

La clase de entorno contiene una referencia a un objeto de estrategia y llama al algoritmo del objeto de estrategia de acuerdo con las necesidades específicas en tiempo de ejecución. La clase de estrategia abstracta define el algoritmo que la clase de estrategia específica debe implementar, y la clase de estrategia específica implementa la lógica del algoritmo específico. Al utilizar el patrón de estrategia, se puede separar la definición y el uso del algoritmo, mejorando la flexibilidad, mantenibilidad y escalabilidad del código.
Insertar descripción de la imagen aquí

Idea principal

La idea central del patrón estratégico es separar la definición y el uso de algoritmos. En el patrón de estrategia, encapsulamos diferentes algoritmos en diferentes clases de estrategia y mantenemos una referencia a un objeto de estrategia a través de la clase de entorno. En tiempo de ejecución, se selecciona el objeto de estrategia apropiado según las necesidades específicas y se llama a su algoritmo.

Algoritmo de encapsulación

El patrón de estrategia encapsula diferentes algoritmos en diferentes clases de estrategias. Cada clase de estrategia implementa una lógica algorítmica específica. Al encapsular el algoritmo, podemos separarlo de otro código, haciendo que la definición del algoritmo sea más clara, legible y fácil de mantener.

Insertar descripción de la imagen aquí

Definir estrategias abstractas

El patrón de estrategia define una clase de estrategia abstracta, que contiene los métodos que la clase de estrategia debe implementar. Una clase de estrategia abstracta puede ser una interfaz o una clase abstracta. Al definir estrategias abstractas, podemos unificar las interfaces de diferentes clases de estrategias para que los clientes puedan usar diferentes estrategias de manera unificada.

Usar clase de entorno

El patrón de estrategia contiene una referencia a un objeto de estrategia a través de la clase de entorno. En tiempo de ejecución, el cliente puede seleccionar el objeto de política apropiado según las necesidades específicas y configurarlo en la clase de entorno. La clase de entorno llama al algoritmo del objeto de política de acuerdo con las necesidades específicas durante el tiempo de ejecución, logrando un cambio dinámico del algoritmo.

Resumen de pensamiento

Al separar la definición y el uso de algoritmos, el patrón Estrategia mejora la flexibilidad, la mantenibilidad y la escalabilidad del código. Facilita la modificación y adición de algoritmos sin modificar el código original. Al mismo tiempo, el modo de estrategia también se ajusta al principio de apertura y cierre, y se pueden agregar fácilmente nuevas clases de estrategia.
Insertar descripción de la imagen aquí

Implementación de código Java: un ejemplo del método de ataque de un personaje de juego

Primero, definimos una clase de estrategia abstracta AttackStrategy, que declara un método attack():

public interface AttackStrategy {
    
    
    void attack();
}

Luego, definimos dos clases de estrategias de ataque específicas: MeleeAttackStrategy y RangedAttackStrategy, que implementan la interfaz AttackStrategy respectivamente:

public class MeleeAttackStrategy implements AttackStrategy {
    
    
    @Override
    public void attack() {
    
    
        System.out.println("近战攻击");
    }
}

public class RangedAttackStrategy implements AttackStrategy {
    
    
    @Override
    public void attack() {
    
    
        System.out.println("远程攻击");
    }
}

A continuación, definimos una clase de entorno Character, que contiene un objeto AttackStrategy y proporciona un método setAttackStrategy() para configurar dinámicamente la estrategia de ataque:

public class Character {
    private AttackStrategy attackStrategy;

    public void setAttackStrategy(AttackStrategy attackStrategy) {
        this.attackStrategy = attackStrategy;
    }

    public void attack() {
        attackStrategy.attack();
    }
}

Finalmente, podemos usar el patrón de estrategia en el cliente:


public class Client {
    public static void main(String[] args) {
        Character character = new Character();
        
        character.setAttackStrategy(new MeleeAttackStrategy());
        character.attack(); // 输出:近战攻击
        
        character.setAttackStrategy(new RangedAttackStrategy());
        character.attack(); // 输出:远程攻击
    }
}

Insertar descripción de la imagen aquí

análisis de código

En el código anterior, configuramos diferentes estrategias de ataque para que el personaje pueda usar diferentes métodos de ataque. De esta manera, cuando es necesario agregar nuevos métodos de ataque, solo necesita implementar una nueva clase de estrategia específica y establecer una nueva estrategia de ataque en el cliente, sin modificar el código original.

Análisis de ventajas y desventajas

ventaja

Encapsulación de algoritmos

El patrón de estrategia encapsula diferentes algoritmos en diferentes clases de estrategia, de modo que cada clase de estrategia solo se centra en su propia lógica de algoritmo, lo que mejora la legibilidad y el mantenimiento del código.

Sustituibilidad de estrategias

Dado que el modo de estrategia separa la definición y el uso del algoritmo, se pueden seleccionar diferentes objetos de estrategia de acuerdo con las necesidades específicas durante el tiempo de ejecución para lograr un cambio dinámico del algoritmo. Esto permite que el algoritmo se reemplace y amplíe fácilmente sin modificar el código original.

Escalabilidad del algoritmo

El modo de estrategia se ajusta al principio de apertura y cierre y puede agregar fácilmente nuevas clases de estrategia. Cuando necesite agregar un nuevo algoritmo, solo necesita agregar una nueva clase de estrategia y configurar el objeto de estrategia en la clase de entorno, y no es necesario modificar el código original.

Reutilizabilidad del algoritmo

El patrón de estrategia encapsula algoritmos en clases de estrategia independientes y puede reutilizar el mismo algoritmo en diferentes escenarios. Esto evita la duplicación de código y mejora la reutilización del código.

Insertar descripción de la imagen aquí

defecto

Aumentó el número de clases.

El uso del patrón de estrategia aumentará el número de clases y cada clase de estrategia específica debe definirse por separado. Si hay demasiadas estrategias, puede resultar en demasiadas clases y aumentar la complejidad del código.

El cliente necesita conocer las diferentes clases de pólizas.

Cuando el cliente utiliza el modo de política, necesita comprender diferentes clases de políticas y seleccionar el objeto de política apropiado. Si hay más políticas, puede aumentar la complejidad del cliente.

Lógica de selección de estrategias

Al utilizar el patrón de estrategia, debe seleccionar el objeto de estrategia apropiado según las necesidades específicas. Esta lógica de selección puede ser compleja y requiere que se consideren múltiples factores, lo que aumenta la complejidad del código.

Resumen de ventajas y desventajas.

En general, el patrón de estrategia mejora la flexibilidad, la mantenibilidad y la escalabilidad del código al separar la definición y el uso de algoritmos. Encapsula diferentes algoritmos en diferentes clases de estrategias y realiza conmutación dinámica y reutilización de algoritmos. Sin embargo, el patrón de estrategia también aumenta el número de clases, aumenta la complejidad del cliente y requiere consideración de la lógica de selección de estrategias. Al utilizar el patrón de estrategia, es necesario sopesar sus ventajas y desventajas y elegir el método de uso adecuado.

Supongo que te gusta

Origin blog.csdn.net/weixin_74888502/article/details/132940630
Recomendado
Clasificación