Proxy und Facade sind strukturelle Entwurfsmuster, die unterschiedliche Aufgaben bei der Organisation der Anwendungsarchitektur lösen.
Proxy fungiert als Surrogat oder „Vertreter“ eines Objekts. Seine Aufgabe besteht darin, den Zugriff zu kontrollieren, zu cachen, Lazy Loading zu implementieren, Sicherheit zu regulieren oder Anfragen zu verteilen (z. B. Netzwerkproxy, Sicherheitsproxy). Der Proxy implementiert den gleichen Vertrag (Schnittstelle) wie das reale Objekt.
Beispiel 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() { // Zugriffskontrolle realService.operation(); } }
Facade ist ein Muster, das die Komplexität eines Teilsystems verbirgt, indem es eine einheitliche vereinfachte Schnittstelle bereitstellt. Die Fassade kümmert sich nicht um Zugriffssteuerung oder ergänzende Logik, sie aggregiert nur Aufrufe.
Beispiel in Java:
public class PaymentFacade { private CardService card; private SmsService sms; public void pay() { card.check(); card.charge(); sms.notify(); } }
Wann anwenden:
Schlüsselfeatures:
Darf das Facade-Muster Funktionalität über die ursprünglichen Klassen des Teilsystems hinaus hinzufügen?
Nein, die Fassade aggregiert und vereinfacht nur Aufrufe, neue Funktionalität wird durch andere Muster oder in neuen Diensten implementiert.
Muss Proxy unbedingt durch Vererbung vom Zielobjekt implementiert werden?
Nein, der Proxy implementiert die Schnittstelle des Ziels, verwendet aber häufig Komposition (Kapselung des echten Objekts) anstelle von Vererbung.
Kann die Fassade zur Zugriffskontrolle oder zur Fehlerprotokollierung verwendet werden?
Dafür ist es besser, den Proxy zu verwenden. Die Fassade ist nicht für die eingebaute Unterstützung von Caching, Logging oder Berechtigungsprüfungen gedacht.