template strategy pattern patrones example diseño design-patterns strategy-pattern

design patterns - strategy - ¿Cuándo y cómo se puede aplicar el patrón de estrategia en lugar del patrón de decorador?



template pattern (5)

Citaré un poco más del contexto que creo que es necesario para que tenga sentido.

Las estrategias son una mejor opción en situaciones en las que la clase Componente es intrínsecamente pesada, lo que hace que el patrón Decorator sea demasiado costoso de aplicar. En el patrón Estrategia, el componente reenvía parte de su comportamiento a un objeto de estrategia separado. El patrón de estrategia nos permite modificar o ampliar la funcionalidad del componente reemplazando el objeto de estrategia.

Por ejemplo, podemos admitir diferentes estilos de borde haciendo que el componente difiera el dibujo de borde a un objeto de borde separado. El objeto de borde es un objeto de estrategia que encapsula una estrategia de trazado de borde. Al extender el número de estrategias desde una sola a una lista abierta, logramos el mismo efecto que los decoradores de anidación recursivamente.

Todo lo que esto significa es que ambos patrones se pueden usar para agregar comportamiento a su componente base, y que con Decorador, para agregar múltiples comportamientos, puede anidar los decoradores, mientras que con Estrategia, debe usar múltiples estrategias.

Tiene razón en que las estrategias son generalmente más independientes del componente principal que los decoradores, pero es posible que conozcan el componente. Y para usar el patrón de Estrategia, el componente principal es consciente de la existencia de estrategias, donde eso no es necesario con Decorador.

Estoy aprendiendo patrones de diseño e intentando seguir el libro Go4. En la página: 179, en el capítulo del patrón de decorador, hay una línea que dice "... al extender el número de estrategias desde una sola a una lista abierta, logramos el mismo efecto que decoradores de anidación recursivamente". No entendí esta declaración. Mientras que las estrategias se centran en tener algoritmos independientes, que se pueden establecer dinámicamente y no saben mucho sobre el cliente en el que están establecidos. Mientras que los decoradores no son completamente independientes de los clientes que decoran. De hecho, son del mismo supertipo que el objeto que decoran. ¿Me estoy perdiendo un punto aquí?


La distinción es que en el patrón de Estrategia, un objeto de Estrategia se puede usar para proporcionar información al Contexto a la vez. Con Decorator, puede apilar estrategias una encima de la otra, y así tener lo que ellos llaman números "abiertos".


Para utilizar su ejemplo, es posible que tenga una clase de ventana que se puede desplazar y / o tener su borde pintado de varias maneras (o no tenerlo). Si tuviera que usar la herencia para cubrir todas estas características, necesitaría una subclase para cada combinación de características factible (sin borde sin desplazamiento, borde sin desplazamiento, desplazamiento sin borde, borde y desplazamiento, etc.). Esta es una pesadilla inflexible de mantenimiento a medida que agrega más funciones porque hay una explosión en el número de clases.

El punto principal que están haciendo aquí es que puede usar el patrón de estrategia o el patrón de decorador para resolver mejor este problema. Podría tener una clase de ventana que encapsula un objeto de estrategia de desplazamiento y un objeto de estrategia de borde. O podría tomar su objeto Window, envolverlo dentro de un decorador de bordes y envolverlo dentro de un decorador desplazable.

Pero tienes toda la razón en tu comprensión; estos son dos patrones de diseño diferentes con diferentes características que conducen a diferentes aplicaciones. Con Decorator, el Componente no tiene conocimiento del agente que está agregando funcionalidad ... y por lo tanto tiende a terminar construyendo alrededor de una clase de componente existente. Con la estrategia, es al revés, ya que el componente está empleando (y, por lo tanto, conoce) agentes para realizar diversas tareas; estos agentes generalmente no conocen sus componentes principales.


El patrón de estrategia se puede aplicar cuando la identidad del Objeto es importante para usted. La identidad del objeto permanece independientemente de cuántas estrategias se apliquen, pero para el patrón Decorator. Los objetos se encapsulan entre sí, la identidad original se perderá en la transformación.

  • Patrón decorador cambia la piel de un objeto

  • El patrón de estrategia cambia las agallas de un objeto.


cuando desee usar enfoques múltiples para algo, use un patrón de estrategia. Cuando desee crear algo donde ciertas cosas pueden o no ser utilizadas para alterar un objeto / componente / lo que sea, entonces debe usar un decorador. en otras palabras, también puede decirse que es probable que un decorador agregue funcionalidad (decorar) un objeto y es probable que una estrategia intercambie la funcionalidad.