Proxy Design Pattern is een van de structurele ontwerppatronen en naar mijn mening een van de eenvoudigste patronen om te begrijpen.
Proxy Design Pattern
Het doel van het proxy-ontwerppatroon volgens GoF is: Een vervanger of plaathouder bieden voor een ander object om toegang ertoe te controleren. De definitie zelf is zeer duidelijk, en het proxy-ontwerppatroon wordt gebruikt wanneer we gecontroleerde toegang tot een functionaliteit willen bieden. Stel dat we een klasse hebben die enkele opdrachten op het systeem kan uitvoeren. Nu is het prima als we het gebruiken, maar als we dit programma aan een klanttoepassing willen geven, kunnen er ernstige problemen ontstaan omdat het clientprogramma opdrachten kan geven om enkele systeembestanden te verwijderen of instellingen te wijzigen die je niet wilt. Hier kan een proxyklasse worden gemaakt om gecontroleerde toegang tot het programma te bieden.
Proxy Design Pattern – Hoofdklasse
Aangezien we in Java coderen in termen van interfaces, hier is onze interface en de implementatieklasse. 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 {
//enkele zware implementatie
Runtime.getRuntime().exec(cmd);
System.out.println("'" + cmd + "' command executed.");
}
}
Proxy Ontwerppatroon – Proxyklasse
We willen nu alleen beheerdersgebruikers toegang geven tot de volledige klasse hierboven, als de gebruiker geen beheerder is, worden alleen beperkte commando’s toegestaan. Hier is onze zeer eenvoudige implementatie van de proxyklasse. 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);
}
}
}
}
Clientprogramma voor Proxy Ontwerppatroon
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());
}
}
}
De uitvoer van het bovenstaande voorbeeldprogramma van het proxy ontwerppatroon is:
'ls -ltr' command executed.
Exception Message::rm command is not allowed for non-admin users.
Veelvoorkomende toepassingen van het proxy ontwerppatroon zijn het controleren van toegang of het bieden van een wrapper-implementatie voor betere prestaties. Het Java RMI-pakket maakt gebruik van het proxy patroon. Dat is alles voor het proxy ontwerppatroon in Java.
Source:
https://www.digitalocean.com/community/tutorials/proxy-design-pattern