Patrón de diseño (22) Patrón de estrategia

Patrón de estrategia

1. ¿Qué es el modo de estrategia?

Patrón de estrategia: Defina una serie de clases de algoritmos, encapsule cada algoritmo y permita que se reemplacen entre sí. El patrón de estrategia permite que el algoritmo cambie independientemente de los clientes que lo utilizan. También se denomina patrón de política (Política) .
El modo de estrategia es un modo de comportamiento de objetos.

El propósito principal del modo de estrategia es separar la definición y el uso del algoritmo, es decir, separar el comportamiento del algoritmo del entorno y colocar la definición del algoritmo en una clase de estrategia especial. Cada clase de estrategia encapsula una implementación algoritmo La clase de entorno está programada para la clase de estrategia abstracta y se ajusta al "principio de inversión de dependencia". Cuando aparece un nuevo algoritmo, solo es necesario agregar una nueva clase de estrategia concreta que implemente la clase de estrategia abstracta.

El modo de estrategia es la encapsulación del algoritmo, que separa la responsabilidad del algoritmo del algoritmo en sí, y delega en diferentes gestión de objetos. El patrón de estrategia generalmente encapsula una serie de algoritmos en una serie de clases de estrategias concretas como subclases de clases de estrategias abstractas.

En el modo de estrategia, la comprensión de las clases de entorno y las clases de estrategia abstracta es muy importante.Las clases de entorno son clases que necesitan usar algoritmos. Puede haber varias clases de entorno en un sistema y es posible que deban reutilizar algunos de los mismos algoritmos.

El modo de estrategia se utiliza para la conmutación y expansión libres de algoritmos, y es uno de los modos de diseño más utilizados.
El modo de estrategia corresponde a una familia de algoritmos para resolver un determinado problema, lo que permite a los usuarios elegir un algoritmo de la familia de algoritmos para resolver un determinado problema y, al mismo tiempo, puede reemplazar fácilmente el algoritmo o agregar un nuevo algoritmo. Siempre que implique encapsulación, multiplexación y conmutación de algoritmos, se puede considerar el modo de estrategia.

2. Análisis de roles del patrón de estrategia

Diagrama de estructura del modo de estrategia:
Modo de estrategia

  • Contexto (clase de entorno): la clase de entorno es el papel del algoritmo, puede utilizar una variedad de estrategias al resolver un determinado problema (es decir, implementar un determinado método). Mantener una instancia de referencia a la clase de estrategia abstracta en la clase de entorno para definir la estrategia adoptada.
  • Estrategia (clase de estrategia abstracta): declara métodos abstractos para los algoritmos soportados y es la clase padre de todas las clases de estrategia, puede ser una clase abstracta, una clase concreta o una interfaz. La clase de entorno llama a los algoritmos implementados en la clase de estrategia concreta en tiempo de ejecución a través de los métodos declarados en la clase de estrategia abstracta.
  • ConcreteStrategy (clase de estrategia específica): Implementa el algoritmo declarado en la clase de estrategia abstracta. En tiempo de ejecución, la clase de estrategia concreta anulará el objeto de clase de estrategia abstracta definido en la clase de entorno, y se utiliza un algoritmo específico para implementar un determinado proceso de negocio. .

3. Ventajas y desventajas del modelo de estrategia

ventaja:

  • El modo de estrategia proporciona un soporte perfecto para el "principio de apertura y cierre". Los usuarios pueden seleccionar algoritmos o comportamientos sin modificar el sistema original, o agregar de manera flexible nuevos algoritmos o comportamientos.
  • El modo de estrategia proporciona una forma de administrar familias de algoritmos relacionados. La estructura jerárquica de la clase de estrategia define un algoritmo o una familia de comportamiento, y el uso adecuado de la herencia puede mover el código común a la clase de estrategia abstracta, evitando así la duplicación de código.
  • El modo de estrategia proporciona una forma de reemplazar la relación de herencia. Si no se usa el modo de estrategia, entonces la clase de entorno que usa el algoritmo puede tener algunas subclases, y cada subclase proporciona un algoritmo diferente. Sin embargo, de esta manera, el uso del algoritmo se mezcla con el algoritmo en sí, que no se ajusta al "principio de responsabilidad única". La lógica de decidir qué algoritmo utilizar se mezcla con el algoritmo en sí, lo que imposibilita su evolución. de forma independiente y el uso de la herencia no puede realizar el cambio dinámico de algoritmos o comportamientos mientras el programa se está ejecutando.
  • El uso del modo de estrategia puede evitar múltiples declaraciones de selección condicional. Las declaraciones de selección condicional múltiple no son fáciles de mantener. Mezcla la lógica de qué algoritmo o comportamiento se adopta con la lógica de implementación del algoritmo o comportamiento en sí, y las codifica todas en una declaración de selección condicional múltiple enorme. El método de directamente heredar clases de entorno es primitivo y al revés.
  • El modo de estrategia proporciona un mecanismo de reutilización de algoritmos Dado que los algoritmos se extraen por separado y se encapsulan en clases de estrategia, diferentes clases de entorno pueden reutilizar fácilmente estas clases de estrategia.

Desventajas:

  • El cliente debe conocer todas las clases de estrategia y decidir qué clase de estrategia utilizar. Esto significa que el cliente debe comprender la diferencia entre estos algoritmos para poder seleccionar el algoritmo apropiado a tiempo. En otras palabras, el modo de estrategia solo es aplicable cuando el cliente conoce todos los algoritmos o comportamientos.
  • El modo de estrategia hará que el sistema produzca muchas clases de estrategia específicas, y cualquier pequeño cambio hará que el sistema agregue una nueva clase de estrategia específica.
  • No es posible usar varias clases de estrategia en el cliente al mismo tiempo, es decir, cuando se usa el modo de estrategia, el cliente solo puede usar una clase de estrategia a la vez. No se admite el uso de una clase de estrategia para completar algunos funciones y luego use otra clase de estrategia para completar las funciones restantes.

Escena aplicable:

  • Un sistema necesita seleccionar dinámicamente uno de varios algoritmos, luego estos algoritmos pueden encapsularse en clases de algoritmos específicos, y estas clases de algoritmos específicos son todas subclases de una clase de algoritmo abstracto. En otras palabras, todas estas clases de algoritmos específicos tienen una interfaz unificada. De acuerdo con el "Principio de sustitución de Richsteel" y el polimorfismo orientado a objetos, el cliente puede optar por utilizar cualquier clase de algoritmo específica y solo necesita mantener un tipo de datos como algoritmo abstracto. clase Object.
  • Un objeto tiene muchos comportamientos. Si no usa un modelo apropiado, estos comportamientos solo se pueden lograr usando múltiples declaraciones de selección condicional. En este punto, el uso del modo de estrategia para transferir estos comportamientos a las clases de estrategia específicas correspondientes puede evitar el uso de múltiples declaraciones de selección condicional que son difíciles de mantener.
  • El cliente no quiere conocer la compleja estructura de datos relacionada con el algoritmo. Encapsular el algoritmo y la estructura de datos relacionada en la clase de estrategia específica puede mejorar la confidencialidad y seguridad del algoritmo.

4. Impresión práctica

El propósito es claro y fácil de entender.
Las estrategias no se conocen entre sí y no se comunican entre sí.

5. Ejemplo de código

// 抽象策略类
abstract class AbstractStrategy {
    
    
    public abstract void algorithm(); //声明抽象算法
}

// 具体策略类
class ConcreteStrategyA extends AbstractStrategy {
    
    
    //算法的具体实现
    public void algorithm() {
    
    
       //...
    }
}

// 环境类,使用算法的角色类
class Context {
    
    
    private AbstractStrategy strategy; //维持一个对抽象策略类的引用
 
    public void setStrategy(AbstractStrategy strategy) {
    
    
        this.strategy= strategy;
    }
 
    //调用策略类中的算法
    public void algorithm() {
    
    
        strategy.algorithm();
    }
}

// 测试
public static void main(String[] args) {
    
    
    Context context = new Context();
    AbstractStrategy strategy = new ConcreteStrategyA(); //可在运行时指定类型
    context.setStrategy(strategy);
    context.algorithm();
}

Supongo que te gusta

Origin blog.csdn.net/u014099894/article/details/85195212
Recomendado
Clasificación