Proxy-Entwurfsmuster

Das Proxy-Entwurfsmuster ist eines der Strukturmuster und meiner Meinung nach eines der einfachsten Muster zu verstehen.

Proxy-Entwurfsmuster

Die Absicht des Proxy-Entwurfsmusters laut GoF ist: Eine Stellvertreter oder Platzhalter für ein anderes Objekt bereitzustellen, um den Zugriff darauf zu steuern. Die Definition selbst ist sehr klar, und das Proxy-Entwurfsmuster wird verwendet, wenn wir kontrollierten Zugriff auf eine Funktionalität bereitstellen möchten. Angenommen, wir haben eine Klasse, die einen Befehl im System ausführen kann. Wenn wir sie verwenden, ist das in Ordnung, aber wenn wir dieses Programm einer Clientanwendung geben wollen, kann das schwerwiegende Probleme haben, weil die Clientanwendung Befehle zum Löschen einiger Systemdateien oder zum Ändern einiger Einstellungen ausführen kann, die wir nicht möchten. Hier kann eine Proxyklasse erstellt werden, um kontrollierten Zugriff auf das Programm bereitzustellen.

Proxy-Entwurfsmuster – Hauptklasse

Da wir Java in Bezug auf Schnittstellen codieren, hier ist unsere Schnittstelle und ihre Implementierungsklasse. CommandExecutor.java

package com.journaldev.design.proxy;

public interface CommandExecutor {

	public void runCommand(String cmd) throws Exception;
}

CommandExecutorImpl.java

package com.journaldev.design.proxy;

import java.io.IOException;

public class CommandExecutorImpl implements CommandExecutor {

	@Override
	public void runCommand(String cmd) throws IOException {
                // einige schwere Implementierung
		Runtime.getRuntime().exec(cmd);
		System.out.println("'" + cmd + "' command executed.");
	}

}

Proxy-Entwurfsmuster – Proxy-Klasse

Jetzt möchten wir nur Administratoren vollen Zugriff auf die obige Klasse ermöglichen, wenn der Benutzer kein Administrator ist, werden nur eingeschränkte Befehle erlaubt sein. Hier ist unsere sehr einfache Implementierung der Proxy-Klasse. CommandExecutorProxy.java

package com.journaldev.design.proxy;

public class CommandExecutorProxy implements CommandExecutor {

	private boolean isAdmin;
	private CommandExecutor executor;
	
	public CommandExecutorProxy(String user, String pwd){
		if("Pankaj".equals(user) && "J@urnalD$v".equals(pwd)) isAdmin=true;
		executor = new CommandExecutorImpl();
	}
	
	@Override
	public void runCommand(String cmd) throws Exception {
		if(isAdmin){
			executor.runCommand(cmd);
		}else{
			if(cmd.trim().startsWith("rm")){
				throw new Exception("rm command is not allowed for non-admin users.");
			}else{
				executor.runCommand(cmd);
			}
		}
	}

}

Proxy Design Pattern Client Program

ProxyPatternTest.java

package com.journaldev.design.test;

import com.journaldev.design.proxy.CommandExecutor;
import com.journaldev.design.proxy.CommandExecutorProxy;

public class ProxyPatternTest {

	public static void main(String[] args){
		CommandExecutor executor = new CommandExecutorProxy("Pankaj", "wrong_pwd");
		try {
			executor.runCommand("ls -ltr");
			executor.runCommand(" rm -rf abc.pdf");
		} catch (Exception e) {
			System.out.println("Exception Message::"+e.getMessage());
		}
		
	}

}

Die Ausgabe des obigen Beispielprogramms für das Proxy-Entwurfsmuster lautet:

'ls -ltr' command executed.
Exception Message::rm command is not allowed for non-admin users.

Gängige Anwendungen des Proxy-Entwurfsmusters sind die Zugriffssteuerung oder die Bereitstellung einer Wrapper-Implementierung für bessere Leistung. Das Java RMI-Paket verwendet das Proxy-Muster. Das ist alles für das Proxy-Entwurfsmuster in Java.

Source:
https://www.digitalocean.com/community/tutorials/proxy-design-pattern