Java-Entwurfsmuster (design patterns): Proxy

Heute werfen wir einen Blick auf das nächste Entwurfsmuster (Java design patterns) aus der Kategorie der strukturellen Muster (structural patterns) – Proxy. Entwurfsmuster in dieser Kategorie befassen sich mit Klassenstrukturen wie Vererbung (inheritance) und Komposition (composition).

Was ist das Entwurfsmuster Proxy?

Proxy ist ein Entwurfsmuster, das den Zugriff auf ein Objekt zu kontrolliert, indem es über ein anderes Objekt (Proxy) bereitgestellt wird. Dieser Proxy kann zusätzliche Funktionalitäten bieten, wie z. B. die Überprüfung von Zugriffsrechten, das Protokollieren von Zugriffen, das verzögerte Erstellen ressourcenintensiver Objekte und mehr. Dieses Muster gehört zur Gruppe der Strukturmuster, da es sich damit beschäftigt, wie Objekte zu größeren Strukturen zusammengesetzt werden.

Was für ein Problem löst das Entwurfsmuster Proxy?

Proxy löst effektiv Fälle, in denen wir die Kontrolle über den Zugriff auf ein Objekt haben möchten. Zum Beispiel, wenn wir mit einem Objekt mit sensiblen Daten arbeiten, auf das die Anwendung nur unter bestimmten Bedingungen zugreifen darf, oder wenn wir wissen müssen, welche Clients wann auf das betreffende Objekt zugegriffen haben. Proxy ermöglicht es uns, solche Situationen zu lösen, ohne direkten Zugriff auf das Hauptobjekt zu haben. Für den Klienten ist die Verwendung eines Proxy-Objekts ähnlich wie die Verwendung eines echten Objekts, da beide dieselbe Schnittstelle implementieren, auch wenn das Proxy-Objekt eigentlich eineWrapper-Klasse des echten Objekts ist.

Beispiel für die Implementierung des Proxy Musters in Java.

Wir werden nun ein Programm implementieren, das die Verwendung des Entwurfsmusters Proxy in Java bei der Anmeldung bei einem Informationssystem demonstriert. Das Programm überprüft auch die Zugriffsrechte und protokolliert den Zugriff. Pristup.java

package designpatterns;

// Rozhranie definujúce spoločné metódy pre RealnyPristup a ProxyPristup.
public interface Pristup {
    void vykonajOperaciu(String meno, String heslo, int idKlienta);
}

Die Schnittstelle Pristup definiert eine vykonajOperaciu Methode, die RealnyPristup und ProxyPristup gemeinsam haben. RealAccess.java

package designpatterns;

// RealnyPristup - skutočný objekt, ktorý implementuje rozhranie Pristup.
public class RealnyPristup implements Pristup {
    public void vykonajOperaciu(String meno, String heslo, int idKlienta) {
        System.out.println("Vykonávam operáciu pre klienta s ID: " + idKlienta);
    }
}

Die Klasse RealnyPristup implementiert die Schnittstelle Pristup. Sie stellt ein reales Objekt dar, das auch eine reale Operation für einen Client mit einer bestimmten ID ausführt. ProxyAccess.java

package designpatterns;

import java.util.Date;

public class ProxyPristup  implements Pristup {
    private RealnyPristup realnyPristup;

    public void vykonajOperaciu(String meno, String heslo, int idKlienta) {
        logujPristup(idKlienta);
        if (skontrolujPristupovePrava(meno, heslo)) {
            if (realnyPristup == null) {
                realnyPristup = new RealnyPristup();
                System.out.println("Prístup bol povolený.");
            }
            realnyPristup.vykonajOperaciu(meno, heslo, idKlienta);
        } else {
            System.out.println("Nesprávne prístupové údaje. Prístup bol zamietnutý!");
        }
    }

    private boolean skontrolujPristupovePrava(String meno, String heslo) {
        // Simulácia kontrolu prístupových práv, môžete pridať vlastnú logiku
        return "admin".equals(meno) && "heslo123".equals(heslo);
    }

    private void logujPristup(int idKlienta) {
        // Simulácia logovania prístupu
        System.out.println("Pristup klienta s ID [" + idKlienta + "] do systému o " + new Date());
    }
}

Die Klasse ProxyPristup, implementiert die Schnittstelle Pristup. Stellt das Proxy-Objekt dar, das die Zugriffsrechte basierend auf Benutzernamen und Passwort überprüft. Es protokolliert auch den Zugriff und delegiert, wenn die Zugriffsdaten korrekt sind, den Aufruf der Methode vykonajOperaciuem an das reale Objekt RealnyPristup. Main.java

import designpatterns.Pristup;
import designpatterns.ProxyPristup;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        // Použitie Proxy
        Pristup proxy = new ProxyPristup();
        proxy.vykonajOperaciu("jwagner", "heslo123", 823);
        System.out.println();
        Thread.sleep(800);
        proxy.vykonajOperaciu("admin", "heslo1234", 111);
        System.out.println();
        Thread.sleep(700);
        proxy.vykonajOperaciu("admin", "heslo123", 111);
    }
}

In der Main-Methode wird eine Instanz der Klasse ProxyPristupstrong erstellt und wir testen, wie unsere Implementierung Client-Zugriffe überprüft und protokolliert. Das Programm gibt Nachrichten über Zugriffe und Zugriffsverweigerungen basierend auf den eingegebenen Zugangsdaten aus. Wenn die Zugangsdaten mit den erwarteten Werten übereinstimmen (Benutzername „admin“ und Passwort „heslo123“), erlaubt der Proxy den Zugriff auf das echte Objekt und führt dessen Operation aus. Die Zugriffszeit wird ebenfalls protokolliert. Die Ausgabe dieses Beispiels ist: In der Methode main wird eine Instanz der Klasse ProxyPristup erstellt.

Zusammenfassung

Das Entwurfsmuster Proxy wird häufig in Situationen verwendet, in denen wir eine Zugriffskontrolle bereitstellen und zunächst die Korrektheit der Daten und/oder die Berechtigungen zur Verwendung der Methoden überprüfen müssen, bevor wir die Methoden auf dem echten Objekt aufrufen. Wir haben die Dateien mit dem obigen Beispiel in Form von Code vorbereitet, den du direkt in Java ausführen kannst. Lade den Java Proxy Code hier herunter. Beherrschst du die Programmiersprache Java? Wenn du als Java Entwickler auf der Suche nach einem Job bist, informiere dich über unsere Mitarbeiterbenefits und reagiere auf unsere aktuellen Stellenangebote.

Über den Autor

Jozef Wagner

Java Developer Senior

Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

Informieren Sie uns über sich