¿Diferencia entre el patrón Adaptador y el patrón Proxy?

33

Hasta donde se entiende, el patrón del adaptador está creando un objeto envoltorio para nuestro objeto real de interés, simplemente un nivel más de indirección, que proporciona flexibilidad. la flexibilidad está en que, si se cambia la interfaz del objeto real, entonces cambiamos la interfaz del contenedor apuntando al objeto real, dejando la interfaz expuesta del lado del cliente sin cambios.

El patrón de proxy es el mismo, con la diferencia de que cada envoltura de proxy proporciona solo un subconjunto coherente de la funcionalidad del objeto real. ¿Por qué sería útil esto, cuando nos esforzamos por hacer "una clase para un propósito" está más allá de mí?

¿He recibido esto correctamente?

Vorac
fuente

Respuestas:

55

No completamente.

El propósito principal del patrón del adaptador es cambiar la interfaz de la clase / biblioteca A a las expectativas del cliente B. La implementación típica es una clase envolvente o un conjunto de clases. El propósito no es facilitar futuros cambios de interfaz, sino incompatibilidades de interfaz actuales.

El patrón proxy también usa clases de contenedor, pero para un propósito diferente. El propósito del patrón proxy es crear un sustituto para un recurso real. Las razones para usar un proxy pueden ser

  • El recurso real reside en una computadora remota (el proxy facilita la interacción con el recurso remoto)
  • El recurso real es costoso de crear (el proxy asegura que el costo no se incurre a menos que / hasta que sea realmente necesario)

Lo más importante es que un proxy proporciona un reemplazo directo para el recurso real para el que es un sustituto, por lo que debe proporcionar la misma interfaz.

Bart van Ingen Schenau
fuente
En primer lugar, gracias por la excelente respuesta. ¿Un proxy implementa todas las interfaces que necesita el cliente actual o implementa todas las interfaces que proporciona el recurso real?
Vorac
1
@Vorac: Eso depende de la complejidad de la interfaz y su filosofía de diseño. Ambos son posibles, pero si la interfaz es grande / compleja o si cree firmemente en YAGNI, entonces tiene más sentido implementar solo lo que necesita.
Bart van Ingen Schenau
Entonces, dado que el patrón Adaptador usa clases de envoltura, ¿es el patrón Adaptador un patrón proxy?
moonman239
@ moonman239: No, porque la intención de usar una clase contenedora es diferente. El hecho de que dos patrones se vean similares en un diagrama de clase no significa que estén relacionados o se implementen entre sí. Un factor importante para que los patrones sean diferentes es su intención.
Bart van Ingen Schenau