[Design Pattern] Strukturelle Muster: Proxy


#1
Hallo,

dieser Beitrag demonstriert das Strukturelle Muster (Structural Pattern): Proxy

Ein Proxy ist ein Stellvertreter-Objekt welches ermöglicht den Zugriff (Methodenaufrufe)
auf ein bestimmtes Ziel-Objekt zu kontrollieren.

So kann der Proxy beispielsweise vor der Ausführung einer Methode notwendige Berechtigungen prüfen, Transaktionen Starten, Cache Lookups durchführen oder einen Entfernten Prozedur Aufruf durchführen. Analog dazu kann innerhalb eines Proxies dann nach dem Aufruf der Methode am Zielobjekt den Rückgabewert prüfen, Transaktionen commiten oder zurückrollen, Caches aktualisieren etc.

Hier dazu mal ein kleines einfaches Beispiel zum Proxy Pattern:
Java:
package de.tutorials.design.patterns.structural;

import java.util.concurrent.atomic.AtomicBoolean;

import org.jpatterns.gof.ProxyPattern;

public class ProxyExample {
  public static void main(String[] args) {
    AtomicBoolean maintenanceModeOn = new AtomicBoolean();
    
    Service service = new MaintenanceModeServiceProxy(new ServiceImpl(),maintenanceModeOn);
    
    service.businessMethod();
    maintenanceModeOn.set(true);
    try{
      service.businessMethod();
    }catch(Throwable t){
      System.err.println(t);
    }
    maintenanceModeOn.set(false);
    service.businessMethod();
  }
  
  @ProxyPattern.Subject
  static interface Service{
    void businessMethod();
  }
  
  @ProxyPattern.Proxy
  static class MaintenanceModeServiceProxy implements Service{
    final Service service;
    final AtomicBoolean maintenanceModeSwitch;

    public MaintenanceModeServiceProxy(Service service, AtomicBoolean maintenanceModeSwitch) {
      this.service = service;
      this.maintenanceModeSwitch = maintenanceModeSwitch;
    }


    public void businessMethod() {
      if(maintenanceModeSwitch.get()){
        throw new IllegalStateException("Service is in mainenance mode");
      }else{
        this.service.businessMethod();
      }
    }
  }
  
  @ProxyPattern.RealSubject
  static class ServiceImpl implements Service{
    public void businessMethod() {
      System.out.println("businessMethod");
    }
  }
}
Ausgabe:
Code:
businessMethod
java.lang.IllegalStateException: Service is in mainenance mode
businessMethod
Dynamic Proxies:
Dynamic Proxies sind dynamisch zur Laufzeit erzeugte Instanzen von generierten Klassen
die eine Menge von Vorgegebenen Interfaces implementieren. Die Implementierung der interfaces
wird dabei über sogenannte InvocationHandler realisiert.

Hier mal einige kurze Beispiele zu den vielfältigen Einsatzmäglichkeiten von Dynamic Proxies:
http://www.tutorials.de/java/312806-beispiel-zu-leicht-anpassbaren-anwendungen-mit-scripting.html
http://www.tutorials.de/java/275762-setter-eines-objektes-ueberwachen.html
http://www.tutorials.de/java/284282-methode-nach-bestimmter-zeit-beenden.html
http://www.tutorials.de/java/250691-dynamisch-zur-laufzeit-getypte-modelle-erzeugen.html


Gruß Tom