Patrón de estrategia


En programación informática , el patrón de estrategia (también conocido como patrón de política ) es un patrón de diseño de software de comportamiento que permite seleccionar un algoritmo en tiempo de ejecución. En lugar de implementar un solo algoritmo directamente, el código recibe instrucciones en tiempo de ejecución sobre cuál usar en una familia de algoritmos. [1]

La estrategia permite que el algoritmo varíe independientemente de los clientes que lo utilicen. [2] La estrategia es uno de los patrones incluidos en el influyente libro Design Patterns de Gamma et al. [3] que popularizó el concepto de usar patrones de diseño para describir cómo diseñar software orientado a objetos flexible y reutilizable. Aplazar la decisión sobre qué algoritmo usar hasta el tiempo de ejecución permite que el código de llamada sea más flexible y reutilizable.

Por ejemplo, una clase que realiza la validación de los datos entrantes puede usar el patrón de estrategia para seleccionar un algoritmo de validación según el tipo de datos, la fuente de los datos, la elección del usuario u otros factores discriminatorios. Estos factores no se conocen hasta el tiempo de ejecución y pueden requerir una validación radicalmente diferente para llevarse a cabo. Los algoritmos de validación (estrategias), encapsulados por separado del objeto de validación, pueden ser utilizados por otros objetos de validación en diferentes áreas del sistema (o incluso en diferentes sistemas) sin duplicación de código .

Normalmente, el patrón de estrategia almacena una referencia a algún código en una estructura de datos y la recupera. Esto se puede lograr mediante mecanismos como el puntero de función nativo , la función de primera clase , clases o instancias de clase en lenguajes de programación orientados a objetos, o accediendo al almacenamiento interno de código de la implementación del lenguaje a través de la reflexión .

En el diagrama de clases UML anterior , la clase no implementa un algoritmo directamente. En cambio, se refiere a la interfaz para realizar un algoritmo ( ), lo que lo hace independiente de cómo se implementa un algoritmo. Las clases y implementan la interfaz, es decir, implementan (encapsulan) un algoritmo. El diagrama de secuencia UML muestra las interacciones en tiempo de ejecución: El objeto delega un algoritmo a diferentes objetos. Primero, llama a un objeto, que realiza el algoritmo y devuelve el resultado a . A partir de entonces, cambia de estrategia y llamaContextContextStrategystrategy.algorithm()ContextStrategy1Strategy2Strategy
ContextStrategyContextalgorithm()Strategy1ContextContextalgorithm()en un Strategy2objeto, que realiza el algoritmo y devuelve el resultado a Context.

Según el patrón de estrategia, los comportamientos de una clase no deben ser heredados. En su lugar, deben encapsularse mediante interfaces. Esto es compatible con el principio abierto/cerrado (OCP), que propone que las clases deben estar abiertas para la extensión pero cerradas para la modificación.


Un diagrama de clase y secuencia UML de muestra para el patrón de diseño de estrategia. [4]
Patrón de estrategia en UML
Patrón de estrategia en LePUS3 ( leyenda )
Los comportamientos de aceleración y frenado deben declararse en cada nuevo modelo de automóvil .