Saltar al contenido

Patrón de estrategia Patrón de decorador V / S

Este tutorial ha sido analizado por especialistas para que tengas la garantía de la exactitud de nuestra esta crónica.

Solución:

El patrón de estrategia te permite cambio la implementación de algo usado en tiempo de ejecución.

El patrón de decorador le permite aumentar (o agregar) la funcionalidad existente con funcionalidad adicional en tiempo de ejecución.

los key La diferencia está en el cambio vs aumentar

En una de las preguntas a las que vinculó, también señala que con el patrón de estrategia el consumidor es consciente de que existen las diferentes opciones, mientras que con el patrón de decorador el consumidor no estaría al tanto de la funcionalidad adicional.

Como ejemplo, imagina que estás escribiendo algo para ordenar una colección de elementos. Entonces escribes una interfaz ISortingStrategy A continuación, puede implementar varias estrategias de clasificación diferentes. BubbleSortStrategy, QuickSortStrategy, RadixSortStrategy, luego su aplicación, basándose en algunos criterios de la lista existente, elige la estrategia más apropiada para usar para ordenar la lista. Por ejemplo, si la lista tiene menos de 10 elementos, usaremos RadixSortStrategy, si se han agregado menos de 10 elementos a la lista desde la última clasificación, usaremos BubbleSortStrategy de lo contrario usaremos QuickSortStrategy.

Estamos cambiando el tipo de clasificación en tiempo de ejecución (para ser más eficientes en función de información adicional). Este es el patrón de estrategia.

Ahora imagine que alguien nos pide que proporcionemos un registro de la frecuencia con la que se utiliza cada algoritmo de clasificación para realizar una clasificación real y para restringir la clasificación a los usuarios administradores. Podemos agregar estas dos piezas de funcionalidad creando un decorador que mejore algunaISortingStrategy. Podríamos crear un decorador que registre que se utilizó para clasificar algo y el tipo de estrategia de clasificación decorada. Y podríamos agregar otro decorador que verifique si el usuario actual es un administrador antes de llamar a la estrategia de clasificación decorada.

Aquí estamos agregando una nueva funcionalidad a cualquier estrategia de clasificación usando el decorador, pero no estamos intercambiando la funcionalidad de clasificación central (usamos las diferentes estrategias para cambiar eso)

Aquí hay un ejemplo de cómo se verían los decoradores:

public interface ISortingStrategy

    void Sort(IList listToSort);


public class LoggingDecorator : ISortingStrategy

    private ISortingStrategy decorated;
    public LoggingDecorator(ISortingStrategy decorated)
    
         this.decorated=decorated;
    

    void Sort(IList listToSort)
     
         Log("sorting using the strategy: " + decorated.ToString();
         decorated.Sort(listToSort);
    


public class AuthorisingDecorator : ISortingStrategy

    private ISortingStrategy decorated;
    public AuthorisingDecorator(ISortingStrategy decorated)
    
         this.decorated=decorated;
    

    void Sort(IList listToSort)
     
         if (CurrentUserIsAdministrator())
         
             decorated.Sort(listToSort);
         
         else
         
             throw new UserNotAuthorizedException("Only administrators are allowed to sort");
         
    

Patrón_estrategia

  1. Define una familia de algoritmos,
  2. Encapsula cada algoritmo y
  3. Hace que los algoritmos sean intercambiables dentro de esa familia.

Utilice el patrón de estrategia cuando tenga que cambiar el algoritmo dinámicamente en tiempo de ejecución.

Decorador

Decorador patrón cambia dinámicamente la funcionalidad de un objeto en tiempo de ejecución sin afectar la funcionalidad existente de los objetos.

Cuándo usar:

  1. Agregue funcionalidades / responsabilidades adicionales de forma dinámica
  2. Eliminar funcionalidades / responsabilidades de forma dinámica
  3. Evite demasiadas subclases para agregar responsabilidades adicionales.

Inconvenientes:

  1. Uso excesivo del principio Abierto Cerrado (Abierto para extensión y Cerrado para modificación). Utilice esta función con moderación donde es menos probable que se cambie el código.
  2. Demasiadas clases pequeñas y agregarán gastos generales de mantenimiento.

Diferencia clave:

La estrategia te permite cambiar las entrañas de un objeto. Decorator te permite cambiar la piel.

Algunas publicaciones más útiles:

¿Cuándo usar el patrón Decorator?

Ejemplo del mundo real del patrón de estrategia

estrategia por sourcemaking

La estrategia es patrón se utiliza para “encapsular qué cambios”. Le permite definir algoritmos que se pueden intercambiar en tiempo de ejecución. Por ejemplo (ejemplo tomado de Head First Design Patterns):

Digamos que tienes un simulador de patos. Quieres hacer volar tus objetos de pato. Podría usar la herencia para esto, pero se complica rápidamente. Algunos patos no pueden volar (por ejemplo, patos de goma). La forma de hacer esto es encapsular los cambios, es decir, el comportamiento de la mosca en su propia clase que implementa IFlybehaviour, por ejemplo. A continuación, puede utilizar la composición en lugar de la herencia e inyectar el comportamiento IFly en sus objetos pato. También podría tener un método que establezca este comportamiento de vuelo para que el comportamiento de vuelo se pueda cambiar en tiempo de ejecución. Este es esencialmente el patrón de estrategia.

El patrón de decorador se usa para agregar funcionalidad a un objeto en tiempo de ejecución. Te permite envolver objetos dentro de objetos. Los decoradores deben tener el mismo supertipo que los objetos que decoran. Esto le permite llamar a un método en la “envoltura más externa” y luego puede llamar en cadena a este mismo método a través de las capas de decoradores. Básicamente es un enfoque más flexible que la subclasificación.

En cuanto a cuáles elijas, depende del problema que quieras resolver. ¿Desea tener una familia de algoritmos que sean intercambiables en tiempo de ejecución o desea agregar dinámicamente más funcionalidad a un objeto en tiempo de ejecución?

El libro “Head first design patterns” explica esto bastante bien (probablemente mucho mejor que yo) en mi opinión, por lo que vale la pena leerlo si tienes la oportunidad.

Buena suerte.

Acuérdate de que te damos el privilegio valorar este tutorial si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *