Patron de conception Proxy

Le modèle de conception Proxy est l’un des modèles de conception structurels et, à mon avis, l’un des modèles les plus simples à comprendre.

Modèle de conception Proxy

L’intention du modèle de conception Proxy selon GoF est : Fournir un substitut ou un espace réservé pour un autre objet afin de contrôler l’accès à celui-ci. La définition elle-même est très claire, et le modèle de conception Proxy est utilisé lorsque nous voulons fournir un accès contrôlé à une fonctionnalité. Supposons que nous ayons une classe qui peut exécuter une commande sur le système. Maintenant, si nous l’utilisons, c’est bien, mais si nous voulons donner ce programme à une application cliente, cela peut poser des problèmes graves car le programme client peut émettre des commandes pour supprimer certains fichiers système ou modifier certains paramètres que vous ne souhaitez pas. Ici, une classe proxy peut être créée pour fournir un accès contrôlé au programme.

Modèle de conception Proxy – Classe principale

Comme nous codons en Java en termes d’interfaces, voici notre interface et sa classe d’implémentation. 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 {
                //quelque lourd implementation
		Runtime.getRuntime().exec(cmd);
		System.out.println("'" + cmd + "' command executed.");
	}

}

Modèle de conception de proxy – Classe Proxy

Maintenant, nous voulons que seuls les utilisateurs administrateurs aient un accès complet à la classe ci-dessus, si l’utilisateur n’est pas administrateur, seules des commandes limitées seront autorisées. Voici notre implémentation très simple de la classe proxy. 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);
			}
		}
	}

}

Programme client du modèle de conception de proxy

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());
		}
		
	}

}

La sortie du programme exemple de modèle de conception de proxy ci-dessus est :

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

Les utilisations courantes du modèle de conception de proxy sont de contrôler l’accès ou de fournir une implémentation d’enveloppe pour de meilleures performances. Le package Java RMI utilise le modèle de conception de proxy. C’est tout pour le modèle de conception de proxy en Java.

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