Proxy y Facade son patrones de diseño estructural que resuelven diferentes problemas en la organización de la arquitectura de aplicaciones.
Proxy actúa como un sustituto o "representante" de un objeto. Su tarea es controlar el acceso, almacenar en caché, implementar carga diferida, gestionar la seguridad o distribuir solicitudes (por ejemplo, un proxy de red, un proxy de seguridad). Proxy implementa el mismo contrato (interfaz) que el objeto real.
Ejemplo en Java:
public interface Service { void operation(); } public class RealService implements Service { public void operation() { // ... } } public class ProxyService implements Service { private RealService realService = new RealService(); public void operation() { // verificación de acceso realService.operation(); } }
Facade es un patrón que oculta la complejidad de un subsistema, proporcionando una interfaz simplificada y única. Facade no se encarga del control de acceso o lógica adicional, solo agrega llamadas.
Ejemplo en Java:
public class PaymentFacade { private CardService card; private SmsService sms; public void pay() { card.check(); card.charge(); sms.notify(); } }
Cuándo aplicar:
Características clave:
¿Está permitido que el patrón Facade agregue funcionalidad más allá de las clases originales del subsistema?
No, Facade solo agrega y simplifica llamadas, la nueva funcionalidad se implementa con otros patrones o en nuevos servicios.
¿Es obligatorio que Proxy se implemente mediante herencia del objeto objetivo?
No, Proxy implementa la interfaz del objetivo, pero a menudo se utiliza la composición (encapsulación del objeto real) en lugar de herencia.
¿Se puede usar Facade para gestionar el acceso o los registros de errores?
Para eso es mejor usar Proxy. Facade no está diseñado para soportar internamente el almacenamiento en caché, el registro o la verificación de derechos.