Proxy e Facade sono pattern di progettazione strutturale che risolvono compiti diversi nell'organizzazione dell'architettura delle applicazioni.
Proxy funge da surrogato o "sostituto" di un oggetto. Il suo compito è controllare l'accesso, memorizzare nella cache, implementare il caricamento pigro, regolare la sicurezza o distribuire le richieste (ad esempio, un proxy di rete, proxy di sicurezza). Il Proxy implementa lo stesso contratto (interfaccia) dell'oggetto reale.
Esempio in 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() { // controllo accesso realService.operation(); } }
Facade è un pattern che nasconde la complessità di un sottosistema, fornendo un'interfaccia semplificata unificata. Facade non si occupa di controllo degli accessi o logica complementare, aggrega solo le chiamate.
Esempio in Java:
public class PaymentFacade { private CardService card; private SmsService sms; public void pay() { card.check(); card.charge(); sms.notify(); } } }
Quando applicare:
Caratteristiche chiave:
È consentito al pattern Facade aggiungere funzionalità oltre le classi di base del sottosistema?
No, Facade aggrega e semplifica solo le chiamate, nuove funzionalità sono implementate da altri pattern o in nuovi servizi.
È necessario che il Proxy venga implementato tramite ereditarietà dall'oggetto di destinazione?
No, il Proxy implementa l'interfaccia della destinazione, ma spesso si utilizza la composizione (incapsulamento dell'oggetto reale) piuttosto che l'ereditarietà.
Può essere usato il Facade per controllare l'accesso o il logging degli errori?
Per questo è meglio utilizzare il Proxy. Facade non è progettato per supportare nativamente la cache, il logging o il controllo dei diritti.