Proxy en Facade zijn structurele ontwerppatronen die verschillende taken oplossen bij het organiseren van de architectuur van applicaties.
Proxy fungeert als een surrogaat of "vervanger" van een object. De taak is om toegang te controleren, te cachen, lazy loading te implementeren, beveiliging te regelen of verzoeken te distribueren (bijvoorbeeld netwerktop proxy, beveiligingsproxy). Proxy implementeert hetzelfde contract (interface) als het echte object.
Voorbeeld 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() { // toegang controle realService.operation(); } }
Facade is een patroon dat de complexiteit van een subsysteem verbergt door een enkele vereenvoudigde interface te bieden. Facade houdt zich niet bezig met toegangscontrole of aanvullende logica, het aggregeert alleen de oproepen.
Voorbeeld in Java:
public class PaymentFacade { private CardService card; private SmsService sms; public void pay() { card.check(); card.charge(); sms.notify(); } }
Wanneer toe te passen:
Belangrijkste kenmerken:
Is het toegestaan om functionaliteit aan het Facade-patroon toe te voegen bovenop de oorspronkelijke klassen van het subsysteem?
Nee, Facade aggregeert en vereenvoudigt alleen de oproepen, nieuwe functionaliteit wordt gerealiseerd door andere patronen of in nieuwe services.
Moet Proxy verplicht worden geïmplementeerd door middel van overerving van het doelobject?
Nee, Proxy implementeert de interface van het doel, maar vaak wordt compositie (encapsulatie van het echte object) gebruikt in plaats van overerving.
Kan Facade worden gebruikt voor toegangsbeheer of foutlogging?
Daarvoor kun je beter Proxy gebruiken. Facade is niet ontworpen voor ingebouwde ondersteuning voor caching, logging of rechtencontroles.