tipos software pattern patron intermediario example estructural ejemplo diseño crear oop design-patterns decorator proxy-pattern

oop - software - Diferencias entre el patrón Proxy y Decorator



patron proxy example (5)

La respuesta aceptada no es del todo correcta. La verdadera diferencia no es la propiedad (composición versus agregación), sino más bien la información de tipo.

Un decorador siempre pasa su delegado. Un Proxy podría crearlo él mismo, o podría haberlo inyectado.

Pero un Proxy siempre conoce el tipo (más) específico del delegado. En otras palabras, el Proxy y su delegado tendrán el mismo tipo base, pero el Proxy apunta a algún tipo derivado. Un decorador apunta a su propio tipo de base. Por lo tanto, la diferencia está en la información en tiempo de compilación sobre el tipo de delegado.

En un lenguaje dinámico, si el delegado está inyectado y tiene la misma interfaz, entonces no hay diferencia.

La respuesta a tu pregunta es sí".

¿Puedes dar alguna buena explicación sobre la diferencia entre Proxy y Decorator ?

La principal diferencia que veo es que cuando asumimos que Proxy usa la composición y Decorator usa la agregación , parece claro que al usar múltiples (uno o más) decoradores puedes modificar / agregar funcionalidades a una instancia preexistente (decorar), mientras que Proxy tiene su propia instancia interna de la clase proxied y lo delega agregando algunas características adicionales (comportamiento del proxy).

La pregunta es: ¿ Proxy creado con agregación sigue siendo Proxy o más bien Decorator ? ¿Está permitido (por definición en patrones GoF) crear Proxy con agregación?


Proxy y Decorator difieren en el propósito y donde se enfocan en la implementación interna. Proxy es para usar un objeto remoto, de proceso cruzado o de red cruzada como si fuera un objeto local. Decorator es para agregar un nuevo comportamiento a la interfaz original.

Si bien ambos patrones son similares en estructura, la mayor parte de la complejidad de Proxy reside en garantizar una comunicación adecuada con el objeto fuente. Decorator, por otro lado, se enfoca en la implementación del comportamiento agregado.


Diferencias clave:

  1. Proxy proporciona la misma interfaz. Decorator proporciona una interfaz mejorada.
  2. Decorator y Proxy tienen diferentes propósitos pero estructuras similares. Ambos describen cómo proporcionar un nivel de indirección a otro objeto, y las implementaciones mantienen una referencia al objeto al que envían las solicitudes.
  3. Decorator se puede ver como un compuesto degenerado con solo un componente. Sin embargo, un Decorador agrega responsabilidades adicionales, no está destinado a la agregación de objetos.
  4. Decorator admite composición recursiva
  5. La clase Decorator declara una relación de composición con la interfaz LCD (denominador de clase más bajo) y este miembro de datos se inicializa en su constructor.
  6. Use Proxy para la inicialización lenta, la mejora del rendimiento al almacenar en caché el objeto y controlar el acceso al cliente / llamante

Sourcemaking artículo de Sourcemaking cita las similitudes y diferencias de manera excelente.

Preguntas / enlaces SE relacionados:

Cuándo usar el patrón decorador?

¿Cuál es la diferencia exacta entre los patrones de adaptador y proxy?


El decorador obtiene una referencia para el objeto decorado (generalmente a través del constructor) mientras que el Proxy es responsable de hacerlo por sí mismo.

Es posible que Proxy no cree instancia alguna para el objeto wrapping (así hacen los ORM para evitar el acceso innecesario a DB si no se usan los campos de objeto / getters) mientras Decorator siempre mantiene el enlace a la instancia real envuelta.

Proxy generalmente utilizado por los frameworks para agregar seguridad o caching / holgazanería y construido por framework (no por el propio desarrollador).

El decorador usualmente agrega un nuevo comportamiento a las clases antiguas o heredadas por el desarrollador en sí mismo, basado en la interfaz en lugar de la clase real (por lo que funciona en una amplia gama de instancias de interfaz, el Proxy está alrededor de la clase concreta).


El Patrón Decorador se enfoca en la adición dinámica de funciones a un objeto, mientras que el Patrón Proxy se enfoca en controlar el acceso a un objeto.

EDITAR:-

La relación entre un Proxy y el sujeto real generalmente se establece en tiempo de compilación, Proxy lo ejemplifica de alguna manera, mientras que Decorator se asigna al sujeto en tiempo de ejecución, conociendo solo la interfaz del sujeto.