¿Puedes dar una buena explicación de cuál es la diferencia entre Proxy y Decorator ?
La principal diferencia que veo es que cuando asumimos que Proxy usa composición y Decorator usa agregación, entonces parece claro que al usar múltiples (uno o más) Decoradores puedes modificar / agregar funcionalidades a instancias preexistentes (decorar), mientras que Proxy tiene su propia instancia interna de clase proxied y delega en ella agregando algunas características adicionales (comportamiento de proxy).
La pregunta es: ¿el Proxy creado con agregación sigue siendo Proxy o más bien Decorador ? ¿Está permitido (por definición en los patrones GoF) crear Proxy con agregación?
oop
design-patterns
decorator
proxy-pattern
Łukasz Rzeszotarski
fuente
fuente
Respuestas:
Aquí está la cita directa del GoF (página 216).
Las respuestas populares indican que un Proxy conoce el tipo concreto de su delegado. De esta cita podemos ver que no siempre es cierto.
La diferencia entre Proxy y Decorator según GoF es que Proxy restringe al cliente. Decorador no. Proxy puede restringir lo que un cliente hace mediante el control de acceso a la funcionalidad; o puede restringir lo que un cliente sabe al realizar acciones que son invisibles y desconocidas para el cliente. Decorator hace lo contrario: mejora lo que hace su delegado de manera visible para los clientes.
Podríamos decir que Proxy es una caja negra, mientras que Decorator es una caja blanca.
La relación de composición entre el contenedor y el delegado es la relación incorrecta en la que se debe enfocar al contrastar Proxy con Decorator, porque la composición es la característica que estos dos patrones tienen en común. La relación entre el contenedor y el cliente es lo que diferencia estos dos patrones.
fuente
La verdadera diferencia no es la propiedad (composición versus agregación), sino más bien la información de tipo.
Un decorador está siempre pasó su delegado. Un Proxy podría crearlo él mismo, o podría tenerlo 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 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 se inyecta y tiene la misma interfaz, entonces no hay diferencia.
La respuesta a tu pregunta es sí".
fuente
Decorator Pattern se enfoca en agregar dinámicamente funciones a un objeto, mientras que Proxy Pattern se enfoca en controlar el acceso a un objeto.
EDITAR:-
Relación entre un Proxy y el sujeto real generalmente se establece en tiempo de compilación, Proxy lo instancia de alguna manera, mientras que Decorator se asigna al sujeto en tiempo de ejecución, conociendo solo la interfaz del sujeto.
fuente
El decorador obtiene referencia para el objeto decorado (generalmente a través del constructor) mientras Proxy responsable de hacerlo solo.
El proxy no puede crear instancias de objetos envolventes (de este modo, hacer ORM para evitar el acceso innecesario a la base de datos si no se utilizan campos / captadores de objetos) mientras Decorator siempre mantiene el enlace a la instancia envuelta real.
Apoderado generalmente utilizado por los marcos para agregar seguridad o almacenamiento en caché / reposo y construido por el marco (no por el desarrollador habitual en sí).
El decorador generalmente se usa para agregar un nuevo comportamiento a las clases antiguas o heredadas por el propio desarrollador en función de la interfaz en lugar de la clase real (por lo que funciona en una amplia gama de instancias de interfaz, Proxy está en torno a una clase concreta).
fuente
Diferencias clave
El 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?
fuente
Proxy y Decorator difieren en propósito y dónde 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 radica en garantizar una comunicación adecuada con el objeto fuente. Decorator, por otro lado, se enfoca en la implementación del comportamiento agregado.
fuente
Tomó un tiempo descubrir esta respuesta y lo que realmente significa. Algunos ejemplos deberían dejarlo más claro.
Proxy
primero:Y:
Y hay una persona que llama de esto
Authorization
, una muy tonta:Nada inusual hasta ahora, ¿verdad? Obtenga un token de un determinado servicio, use ese token. Ahora viene un requisito más para la imagen, agregar registro: es decir, registrar el token cada vez. Es simple para este caso, solo crea un
Proxy
:¿Cómo usaríamos eso?
Tenga en
LoggingDBAuthorization
cuenta que contiene una instancia deDBAuthorization
. AmbosLoggingDBAuthorization
eDBAuthorization
implementarAuthorization
.DBAuthorization
) de la interfaz base (Authorization
). En otras palabras, un Proxy sabe exactamente lo que se está representando.Decorator
:Comienza casi igual que
Proxy
con una interfaz:y una implementación del mismo:
Y ahora queremos agregar un candidato más experimentado, que agrega su puntaje de entrevista más el de otro
JobSeeker
:Observe cómo dije eso más el de otro JobSeeker , no
Newbie
. ADecorator
no sabe exactamente qué está decorando, solo conoce el contrato de esa instancia decorada (lo sabeJobSeeker
). Tome nota aquí de que esto es diferente aProxy
; que, por el contrario, sabe exactamente lo que está decorando.¿Podría preguntarse si realmente hay alguna diferencia entre los dos patrones de diseño en este caso? ¿Qué pasa si tratamos de escribir el
Decorator
como aProxy
?Esta es definitivamente una opción y destaca cuán cerca están estos patrones; todavía están destinados a diferentes escenarios como se explica en las otras respuestas.
fuente
Proxy proporciona la misma interfaz para el objeto envuelto, Decorator le proporciona una interfaz mejorada, y Proxy generalmente administra el ciclo de vida de su objeto de servicio por sí mismo, mientras que la composición de Decoradores siempre es controlada por el cliente.
fuente